2017-02-24 8 views
0

は、クラスを考えてみましょう:Javaで定数属性を持つXMLをserializeするにはどうすればよいですか?

@XmlRootElement(name="root") 
class Dto { 
    @XmlElement 
    @Xml????("constantValue") 
    private String field = "12345"; 
} 

出力は

<root> 
    <field myAttribute="constantValue">12345</field> 
</root> 

質問は注釈がXml????の代わりに使用するものですすべきですか?

重要な注意

例の多くは@XmlAttributeを使用することをお勧めしますが、そのようなラッパーを作成するには、このリード:あなたが属性を見ることができるように

@XmlRootElement(name="root") 
class Dto { 
    @XmlElement 
    private Wrapper field = new Wrapper("12345"); 
} 

class Wrapper { 
    @XmlElement 
    private String field; 
    @XmlAttribute   
    private String myAttribute = "constantValue"; 

    public Wrapper(String field) { 
     this.field = field; 
    } 
} 

が一定であるので、ノーありクラス内のすべてのStringフィールドのラッパーを作成する必要があります。したがって@XmlAttributeは、属性を囲むクラスにアタッチしますが、この場合は不適切ではありません。

答えて

0

@XMLAttributeは、このXML結果に対してのみ有効なソリューションです。また、DTOクラスを使用すると、データを簡単にマップできます。他のすべてはjaxbではありません。

public class XmlTest { 

    @Test 
    public void rootTest() throws JAXBException { 
     JAXBContext jaxbContext = JAXBContext.newInstance(Root.class); 
     Marshaller marshaller = jaxbContext.createMarshaller(); 

     StringWriter writer = new StringWriter(); 

     Root root = new Root(new Field("constantValue", "123456")); 

     marshaller.marshal(root, writer); 

     System.out.println("Output: " + writer.toString()); 
    } 

    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlRootElement(name = "root") 
    public static class Root { 

     @XmlElementRef(name = "field") 
     Field field; 

     public Root(Field field) { 
      super(); 
      this.field = field; 
     } 
    } 

    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlRootElement(name = "field") 
    public static class Field { 
     @XmlAttribute(name = "myAttribute") 
     String myAttribute; 

     @XmlValue 
     String value; 

     public Field(String myAttribute, String value) { 
      super(); 
      this.myAttribute = myAttribute; 
      this.value = value; 
     } 

    } 
} 
関連する問題