jaxb2Marshaller unmarshals XML в пустой массив байтов - PullRequest
1 голос
/ 05 мая 2011

вот в чем проблема.Я использую Spring 3.0.4 для создания веб-службы отдыха (и на самом деле я новичок).Я хочу сохранить объект через Hibernate, переданный клиентом как представление XML.Для выполнения этой задачи я использую jaxb2.

Объект, который отправляет клиент, является узлом, имеющим два объекта сыновья, а именно данные и метаданные.

проблема заключается в том, что когда клиент отправляет свой XML, SIUserDataне маршалируется в непредсказуемом массиве byte []: иногда часть импульса обрезается, а иногда просто пуста.

например, этот вход

<.SINode>
    <.SIUserMeta>a lot of meta<./SIUserMeta>
    <.SIUserData>BBB<./SIUserData>
<./SINode>

не маршалируется в объектес пустым атрибутом содержимого StorageInterfaceData.

Я считаю, что проблема влияет на обработку байта [], так как я попытался изменить тип атрибута содержимого StorageInterfaceData в конце строки, все работает нормально: S.

Это следует за кодом.

узел

@Entity
@Table(name="sinode")
@XmlRootElement(name="SINode")
public class StorageInterfaceNode extends BulkObject  implements Serializable{


    private Integer id;
    private String name;
    private StorageInterfaceMetadata metadata;
    private StorageInterfaceData data;

    public StorageInterfaceNode() {
        super();
        // TODO Auto-generated constructor stub
    }

    public StorageInterfaceNode(Integer id, String name, StorageInterfaceMetadata metadata,
            StorageInterfaceData data) {
        super();
        this.id = id;
        this.name = name;
        this.metadata = metadata;
        this.data = data;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id", unique=true, nullable=false)
    @XmlTransient
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @XmlTransient
    @Column(name="name", unique=true)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @OneToOne(cascade= CascadeType.ALL)
    @XmlElement(name="SIUserMeta")
    public StorageInterfaceMetadata getMetadata() {
        return metadata;
    }
    public void setMetadata(StorageInterfaceMetadata metadata) {
        this.metadata = metadata;
    }

    @OneToOne(cascade= CascadeType.ALL)
    @XmlElement(name="SIUserData")
    public StorageInterfaceData getData() {
        return data;
    }
    public void setData(StorageInterfaceData data) {
        this.data = data;
    }

}

данные

@Entity
@Table(name="data")
public class StorageInterfaceData extends BulkObject implements Serializable{


    private Integer id;
    private String dataName;
    private byte[] content;

    public StorageInterfaceData() {
        super();
        // TODO Auto-generated constructor stub
    }

    public StorageInterfaceData(byte[] content) {
        super();
        this.content = content;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id", unique=true)
    @XmlTransient
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name="name", unique=true, nullable=false)
    @XmlTransient
    public String getDataName() {
        return dataName;
    }

    public void setDataName(String dataName) {
        this.dataName = dataName;
    }

    @Column(name="content", nullable=false)
    @XmlValue
    public byte[] getContent() {
        return content;
    }

    public void setContent(byte[] content) {
        this.content = content;
    }
}

массив объекта

@XmlTransient
public class BulkObject {

    private Integer id;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

}

класс метаданных опущен, чтобы не быть слишком многословным.Кто-нибудь может очистить вещь, пожалуйста?

1 Ответ

2 голосов
/ 06 мая 2011

хорошо, я думаю, что понял.

Я действительно не знаю почему, но во время процедуры демаршаллинга JAXB2 сознательно предполагает, что вещи в моих тегах SIUserData кодируются в base64.Я сделал свой тест написанием простого текста, и то, что было возвращено, было для меня чем-то бессмысленным.

Например, я написал «много данных» (текстуально) в тегах SIUserData, и я POSTed узел.Как только я ПОЛУЧИЛ это назад, я прочитал "alotofda", и это меня немного расстроило.Я мог понять, что пробелы исчезли, но почему это должно сократить последнюю "та" ?!С моей точки зрения, были некоторые проблемы в обработке байта [].

Я был не прав, и вот как все обстоит так: для приложения "много данных" - это кодированный ввод base64.JAXB2 обрабатывает его внутри, выполняя декодирование и получение "jZ-¡÷ Z".Когда я спрашиваю его обратно с помощью GET, JAXB2 выполняет обратную операцию, получая «alotofda».Проблема возникает из-за того, что «много данных» не соответствует base64.То же самое происходит со строкой "BBB", которую я упоминал выше в вопросе.Если я использую реальные данные в кодировке base64, все работает отлично.Это моя удача, так как я должен управлять своими данными.Просто для полноты, кто-нибудь знает, как обрабатывать данные в XML с использованием различных форматов?И как преодолеть это поведение JAXB2?

...