【发布时间】:2011-12-11 13:51:24
【问题描述】:
我是 RESTful webservices 的新手,正试图从独立的客户端应用程序更新我的 @OneToMany 关系,但我无法做到这一点。我正在使用 Glassfish 3.1.1 附带的 JAX-RS 的 Jersey 实现。
我有一个类A,它与类B 有@OneToMany 关系。
MyRestClient 是我的独立客户端,它正在调用已部署在 Glassfish 3.1.1 上的 RESTful Web 服务。
MyRestClient.java
public class MyRestClient {
public static void main(String[] args) {
Client client = Client.create();
WebResource resource = client.resource("http://localhost:8080/myapp/rest/a/update/123");
B b1 = new B("debris");
ClientResponse response = resource.put(ClientResponse.class, b1);
System.out.println(response.getEntity(A.class).getTitle() + " has " + response.getEntity(A.class).getBList().size() + " Bs.");
}
}
AResource 是一个 EJB 会话 bean,我将其用作 RESTful Web 服务。
AResource.java
@Stateless
@Path("/a")
public class AResource {
@EJB
private AManager aManager;
@PUT
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
@Path("/update/{id}")
public Response updateA(B b, @PathParam("id") int id) {
A a = aManager.findAById(id);
a.addB(b);
return Response.status(Status.OK).entity(a).build();
}
}
当我运行客户端时,我收到以下错误消息: com.sun.jersey.api.client.ClientHandlerException:找不到 Java 类型 myPackage.B 类和 MIME 媒体类型 application/octet-stream 的消息正文编写器。
以下是我的独立客户端应用程序中的域对象,它正在调用 AResource EJB 会话 bean,我将其用作 RESTful Web 服务。
A.java
@XmlRootElement
public class A implements Serializable{
private List<B> bList = new ArrayList<B>();
public List<B> getBList() {
return bList;
}
//remaining code
}
B.java
public class B implements Serializable {
private String text;
private A a;
@XmlTransient
public A getA() {
return a;
}
public void afterUnmarshal(Unmarshaller u, Object parent) {
this.a = (A) parent;
}
//remaining code
}
有人能帮我理解为什么会发生这种情况以及我应该如何解决这个问题吗?
【问题讨论】:
标签: web-services rest jersey java-ee-6 jax-rs