当使用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。
提前致谢!!!
答案 0 :(得分:3)
我建议在这个用例中使用JAXB的XmlAdapter:
答案 1 :(得分:2)
JaxB可能不知道如何序列化StringBuffer。我要做的就是解决这类问题,就是拥有一对getter / setter:
您目前拥有的
返回String并使用@XmlElement
注释的字符串import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement;
@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”属性。