Маршалинг объекта с атрибутами StringBuffer - PullRequest
3 голосов
/ 23 февраля 2011

При маршалинге объекта через JAXB с атрибутом StringBuffer этот атрибут становится пустым.Я написал небольшую программу для демонстрации проблемы:

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 ]

3 голосов
/ 23 февраля 2011

Я бы рекомендовал использовать JAXB XmlAdapter для этого случая использования:

2 голосов
/ 23 февраля 2011

Вполне вероятно, что JaxB не знает, как сериализовать StringBuffer. Что бы я сделал, чтобы решить проблемы такого рода, это иметь пару получателей / установщиков:

  1. тот, который у вас сейчас есть

  2. тот, который возвращает строку и аннотирован @ 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);
}

}

Я не совсем уверен, но я думаю, что если вы используете @XmlElement (name = "valueTwo") в методе getValueTwoString (), вы должны получить именно то, что вы хотите.

0 голосов
/ 24 февраля 2011

Спасибо за все быстрые и замечательные ответы !!

Эта проблема возникла при использовании компонента servicemix-exec в ServiceMix 4.2, которая вызвана этим ExecResponse классом.Он использует StringBuffer для атрибутов «outputData» и «errorData».

0 голосов
/ 23 февраля 2011

Когда у меня возникают проблемы с маршалингом с простыми типами, я стремлюсь создать дополнительный геттер (и, возможно, сеттер), чтобы упростить его.Затем я добавляю @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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...