ここに問題があります。私は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;
}
}
メタデータクラスは、冗長になりすぎないように省略されています。誰かが物事をクリアしてくれませんか?