1

这就是问题所在。我正在使用 Spring 3.0.4 创建一个 rest web 服务(实际上我是一个新手)。我想通过客户端作为 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;
    }
}

散装对象

@XmlTransient
public class BulkObject {

    private Integer id;

    public Integer getId() {
        return id;
    }

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

}

省略元数据类以免过于冗长。有人可以澄清一下吗?

4

1 回答 1

2

好的,我想我明白了。

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

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

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

于 2011-05-06T15:45:35.027 回答