jaxb2Marshaller将XML解组为空字节数组

时间:2011-05-05 17:47:44

标签: arrays jaxb byte jaxb2 unmarshalling

这是问题所在。 我正在使用Spring 3.0.4创建一个休息Web服务(实际上我是一个新手)。 我希望通过客户端传递的hibernate将对象持久化为XML表示。要完成此任务,我使用jaxb2。

客户端发送的对象是具有两个子对象的节点,即数据和元数据。

问题在于,当客户端发送其XML时,SIUserData在一个不可预测的byte []数组中被解组:有时,一部分输入被切除,有时它只是空的。

例如此输入

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

在具有空StorageInterfaceData内容属性的对象中进行解组。

我认为这个问题会影响byte []的处理,因为我试图在String结束时更改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;
    }
}

bulkobject

@XmlTransient
public class BulkObject {

    private Integer id;

    public Integer getId() {
        return id;
    }

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

}

省略元数据类,不要太冗长。 有人可以清楚这件事吗?

1 个答案:

答案 0 :(得分:2)

好吧,我想我明白了。

我真的不知道为什么,但是在解组过程中,JAXB2故意假定我的SIUserData标签中的东西是用base64编码的。 我做了我的测试,写了纯文本,返回的内容对我来说毫无意义。

例如,我在SIUserData标签中写了“大量数据”(文本),并在节点上发布了POST。一旦我收回它,我读了“alotofda”,这让我有点不高兴。我能理解白色空间消失但为什么要切掉最后的“ta”?!从我的角度来看,在处理byte []方面存在一些问题。

我错了,事情就是这样: 对于应用程序,“很多数据”是base64编码的输入。 JAXB2在内部执行解码并获得“jZ-¡Z”。当我用GET请求它时,JAXB2执行逆操作获得“alotofda”。问题突然出现,因为“很多数据”不是符合base64的字符串。 我在上面提到的问题中提到的“BBB”字符串也是如此。 如果我使用真正的base64编码数据,一切都很完美。这是我的运气,因为这是我管理数据的方式。 为了完整起见,任何人都知道如何使用不同的格式处理XML数据?以及如何克服这种JAXB2行为?