Je ne pouvais pas obtenir @XmlValue
en travaillant comme j'ai toujours eu NullPointerException
en cours de route-je ne sais pas pourquoi. Je suis venu avec quelque chose comme le suivant à la place.
Déposez votre Bar
classe tout à fait, parce que, comme vous voulez qu'il soit en mesure de contenir quoi que ce soit vous pouvez représenter simplement avec Object
.
@XmlRootElement(name = "foo", namespace = "http://test.com")
@XmlType(name = "Foo", namespace = "http://test.com")
public class Foo {
@XmlElement(name = "bar")
public List<Object> bars = new ArrayList<>();
public Foo() {}
}
Sans dire JAXB qui NAMESPACES vos types utilisent tous les éléments bar
dans un foo
contiendrait des déclarations d'espace de noms séparés et des trucs-le package-info.java
et tous les trucs de l'espace de noms sert uniquement fancification fins seulement.
@XmlSchema(attributeFormDefault = XmlNsForm.QUALIFIED,
elementFormDefault = XmlNsForm.QUALIFIED,
namespace = "http://test.com",
xmlns = {
@XmlNs(namespaceURI = "http://test.com", prefix = ""),
@XmlNs(namespaceURI = "http://www.w3.org/2001/XMLSchema-instance", prefix = "xsi"),
@XmlNs(namespaceURI = "http://www.w3.org/2001/XMLSchema", prefix = "xs")})
package test;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
L'exécution de ce test simple déclencherait quelque chose de similaire à votre extrait XML.
public static void main(String[] args) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(Foo.class);
Foo foo = new Foo();
foo.bars.add("a");
foo.bars.add("b".getBytes());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(foo, System.out);
}
Sortie:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://test.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<bar xsi:type="xs:string">a</bar>
<bar xsi:type="xs:base64Binary">Yg==</bar>
</foo>
Cela nécessiterait que je convertisse des données binaires opaques en une chaîne, par exemple, je dois le coder manuellement, par exemple, hexBinary ou base64. Mais oui, c'est ce que j'utilise actuellement comme une solution de contournement. –
Utilisez-vous votre propre algorithme de codage? Cela devrait être assez facile si vous utilisez [l'encodeur apache commons] (http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html). –
J'utilise le [HexBinaryAdapter] (http://docs.oracle.com/javaee/5/api/javax/xml/bind/annotation/adapters/HexBinaryAdapter.html) qui alt. Commons base64 classe, les deux qui sont gentils one-liners. –