1

ここに問題があります。私はSpring3.0.4を使用してRESTWebサービスを作成しています(実際、私は初心者です)。クライアントからXML表現として渡されたHibernateを介してオブジェクトを永続化したいと思います。このタスクを実行するために、jaxb2を使用します。

クライアントが送信するオブジェクトは、データとメタデータという2つの息子オブジェクトを持つノードです。

問題は、クライアントがXMLを送信するときに、SIUserDataが予測不可能なbyte []配列にマーシャリングされないことです。入力の一部が切り取られることもあれば、単に空になることもあります。

たとえば、この入力

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

StorageInterfaceDataコンテンツ属性が空のオブジェクトではマーシャリングされていません。

文字列の終わりにStorageInterfaceDataコンテンツ属性のタイプを変更しようとしたので、問題はbyte []の処理に影響を与えると思います。すべてが正常に機能します: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タグ内に(テキストで)「大量のデータ」を書き込み、ノードをPOSTしました。それを取り戻すと、私は「alotofda」を読みました、そしてそれは私を少し動揺させました。余白がなくなったのは理解できましたが、なぜ最後の「た」をカットする必要があるのでしょうか。私の観点からは、byte[]の処理にいくつかの問題がありました。

私は間違っていました。これがその方法です。アプリケーションの場合、「大量のデータ」はbase64でエンコードされた入力です。JAXB2は、内部でデコードを実行し、「jZ-¡÷Z」を取得します。GETで質問すると、JAXB2は「alotofda」を取得する逆の操作を実行します。「大量のデータ」はbase64準拠の文字列ではないため、問題が発生します。質問で前述した「BBB」文字列でも同じことが起こります。実際のbase64でエンコードされたデータを使用すると、すべてが完全に機能します。それは私のデータを管理しなければならない方法なので、それは私の運です。完全を期すために、さまざまな形式を使用してXMLでデータを処理する方法を知っている人はいますか?そして、このJAXB2の動作を克服する方法は?

于 2011-05-06T15:45:35.027 に答える