使用StringBuffer属性的Marshaling对象

时间:2011-02-23 16:14:39

标签: java jaxb

当使用StringBuffer属性通过JAXB封送对象时,该属性变为空白。我写了一个小程序来演示这个问题:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class JaxbTest {

    private String valueOne;
    private StringBuffer valueTwo;

    public static void main(String[] args) throws Exception {

        JaxbTest object = new JaxbTest();
        object.setValueOne("12345");
        object.setValueTwo(new StringBuffer("54321"));

        JAXBContext context = JAXBContext.newInstance(JaxbTest.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.marshal(object, System.out);
    }

    @XmlElement
    public String getValueOne() {
        return valueOne;
    }

    public void setValueOne(String valueOne) {
        this.valueOne = valueOne;
    }

    @XmlElement
    public StringBuffer getValueTwo() {
        return valueTwo;
    }

    public void setValueTwo(StringBuffer valueTwo) {
        this.valueTwo = valueTwo;
    }
}

输出如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><jaxbTest><valueOne>12345</valueOne><valueTwo/></jaxbTest>

有谁知道为什么“valueTwo”没有被正确封送?顺便说一句,我使用的是java 1.6.0_22。

提前致谢!!!

4 个答案:

答案 0 :(得分:3)

我建议在这个用例中使用JAXB的XmlAdapter:

答案 1 :(得分:2)

JaxB可能不知道如何序列化StringBuffer。我要做的就是解决这类问题,就是拥有一对getter / setter:

  1. 您目前拥有的

  2. 返回String并使用@XmlElement

    注释的字符串

    import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement;

  3. @XmlRootElement 公共课JaxbTest {

    private String valueOne;
    private StringBuffer valueTwo;
    
    public static void main(String[] args) throws Exception {
    
        JaxbTest object = new JaxbTest();
        object.setValueOne("12345");
        object.setValueTwo(new StringBuffer("54321"));
    
        JAXBContext context = JAXBContext.newInstance(JaxbTest.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.marshal(object, System.out);
    }
    
    @XmlElement
    public String getValueOne() {
        return valueOne;
    }
    
    public void setValueOne(String valueOne) {
        this.valueOne = valueOne;
    }
    
    public StringBuffer getValueTwo() {
        return valueTwo;
    }
    
    public void setValueTwo(StringBuffer valueTwo) {
        this.valueTwo = valueTwo;
    }
    
    @XmlElement
    public String getValueTwoString() {
        return valueTwo!=null?valueTwo.toString():null;
    }
    
    public void setValueTwoString(String valueTwo) {
        this.valueTwo = new StringBuffer(valueTwo);
    }
    

    }

    我不完全确定,但我认为如果你在getValueTwoString()方法中使用@XmlElement(name =“valueTwo”),你应该得到你想要的。

答案 2 :(得分:0)

当我有简单类型的编组问题时,我倾向于创建一个额外的getter(可能是setter)来简化它。然后我将@XmlIgnore添加到主字段,并将新字段的名称设置为旧字段的名称。示例如下:

@XmlRootElement
public class JaxbTest {

    private String valueOne;
    private StringBuffer valueTwo;

    public static void main(String[] args) throws Exception {

        JaxbTest object = new JaxbTest();
        object.setValueOne("12345");
        object.setValueTwo(new StringBuffer("54321"));

        JAXBContext context = JAXBContext.newInstance(JaxbTest.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.marshal(object, System.out);
    }

    @XmlElement
    public String getValueOne() {
        return valueOne;
    }

    public void setValueOne(String valueOne) {
        this.valueOne = valueOne;
    }

    @XmlIgnore
    public StringBuffer getValueTwo() {
        return valueTwo;
    }

    public void setValueTwo(StringBuffer valueTwo) {
        this.valueTwo = valueTwo;
    }

    @XmlElement(name="valueTwo")
    public String getValueTwoString() {
        return valueTwo.toString();
    }

    public void setValueTwoString(String valueTwo) {
        this.valueTwo = new StringBuffer(valueTwo);
    }
}

答案 3 :(得分:0)

感谢所有提示和精彩的答案!

在ServiceMix 4.2中使用servicemix-exec组件时遇到此问题,这是由此ExecResponse类引起的。它使用StringBuffer作为“outputData”和“errorData”属性。