POSTリクエストを介してシリアル化されたオブジェクトをサーバーに送信したい。
Paint paint = new Paint();
paint.setYear(2010);
paint.setTitle("title");
JAXBContext jc = JAXBContext.newInstance(Paint.class, Art.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
java.io.StringWriter sw = new StringWriter();
marshaller.marshal(paint, sw);
ClientRequest request = new ClientRequest("http://localhost:8080/rest/createArt");
request.body("application/xml", sw.toString());
ClientResponse<Response> response = request.post(Response.class);
このシンプルなサービスの場合:
@POST
@Path("/createArt")
@Consumes("application/xml")
public Response createArt(Art a){
artDAO.createArt(a);
return Response.ok(a).build();
}
しかし、私は次のエラーを受け取ります:
DefaultClientConnection:249 - Receiving response: HTTP/1.1 400 javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"paint"). Expected elements are <{}art>, <{}photo>
なぜこれらのクラス?
Art.java:抽象クラス
@Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@XmlRootElement(name = "art")
public abstract class Art {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@OneToMany (mappedBy="art",cascade={CascadeType.PERSIST, CascadeType.REMOVE})
private List<Photo> photo;
...
}
Paint.java:Artから継承
@Entity
@XmlRootElement(name = "paint")
public class Paint extends Art{
@Enumerated(EnumType.STRING)
private SupportArt support;
@Enumerated(EnumType.STRING)
private Realisation realisation;
...
}
Photo.java
@Entity
@XmlRootElement(name = "photo")
public class Photo {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@ManyToOne
@JoinColumn (name="art_id")
private Art art;
private String path;
...
}
エラーがわかりません。JAXBアノテーションの問題だと思います。継承は私にもいくつかの問題を引き起こします。写真とアートの間には双方向の関係があります。写真を削除すると、写真は期待される要素に含まれなくなります(<{}アート>が持続します)。
私はウェブで検索して多くのことを試しましたが、それは私の問題を解決しませんでした。