0

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アノテーションの問題だと思います。継承は私にもいくつかの問題を引き起こします。写真とアートの間には双方向の関係があります。写真を削除すると、写真は期待される要素に含まれなくなります(<{}アート>が持続します)。

私はウェブで検索して多くのことを試しましたが、それは私の問題を解決しませんでした。

4

1 に答える 1

1

エラーが見つかりました。XmlSeeAlsoを使用する必要がありました。

Art.java:抽象クラス

@Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@XmlSeeAlso(Paint.class)
public abstract class Art {

この行も変更する必要がありました:

ClientResponse<String> response = request.post(String.class);
于 2012-12-25T17:24:37.903 に答える