Je crée une série de classes liées dont je veux pouvoir rassembler les instances en XML afin de pouvoir les enregistrer dans un fichier et les relire plus tard.
À l'heure actuelle, j'utilise le code suivant comme cas de test:
import javax.xml.bind.annotation.*;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import Java.time.LocalDate;
public class LocalDateExample
{
@XmlRootElement
private static class WrapperTest {
public LocalDate startDate;
}
public static void main(String[] args) throws JAXBException
{
WrapperTest wt = new WrapperTest();
LocalDate ld = LocalDate.of(2016, 3, 1);
wt.startDate = ld;
marshall(wt);
}
public static void marshall(Object jaxbObject) throws JAXBException
{
JAXBContext context = JAXBContext.newInstance(jaxbObject.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(jaxbObject, System.out);
}
}
La sortie XML est:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wrapperTest>
<startDate/>
</wrapperTest>
Y a-t-il une raison pour laquelle l'élément startDate
est vide? Je voudrais qu'il contienne la représentation sous forme de chaîne de la date (c'est-à-dire toString()
). Dois-je écrire mon propre code pour ce faire?
La sortie de Java -version
Est:
openjdk version "1.8.0_66-internal"
OpenJDK Runtime Environment (build 1.8.0_66-internal-b17)
OpenJDK 64-Bit Server VM (build 25.66-b17, mixed mode)
Vous devrez créer un XmlAdapter
comme ceci:
public class LocalDateAdapter extends XmlAdapter<String, LocalDate> {
public LocalDate unmarshal(String v) throws Exception {
return LocalDate.parse(v);
}
public String marshal(LocalDate v) throws Exception {
return v.toString();
}
}
Et annotez votre champ en utilisant
@XmlJavaTypeAdapter(value = LocalDateAdapter.class)
Voir également javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters
si vous souhaitez définir vos adaptateurs au niveau du package.
http://blog.bdoughan.com/2011/05/jaxb-and-joda-time-dates-and-times.html décrit la configuration du trou.
Joda-Time fournit une alternative aux classes Date et Calendar actuellement fournies dans Java SE. Comme elles sont fournies dans une bibliothèque distincte, JAXB ne fournit pas de mappage par défaut pour ces classes.
Pour enregistrer l'adaptateur pour tous les fichiers d'un package. vous pouvez ajouter package-info.Java dans le package que vous souhaitez enregistrer.
@XmlJavaTypeAdapters({
@XmlJavaTypeAdapter(type=LocalDate.class,
value=LocalDateAdapter.class),
})
package PACKAGE_NAME;
import Java.time.LocalDate;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
L'adaptateur ressemble à:
import javax.xml.bind.annotation.adapters.XmlAdapter;
import Java.time.LocalDate;
public class LocalDateAdapter extends XmlAdapter<String, LocalDate>{
public LocalDate unmarshal(String v) throws Exception {
return LocalDate.parse(v);
}
public String marshal(LocalDate v) throws Exception {
return v.toString();
}
}