web-services - 未找到 Java 类型 myPackage.B 类和 MIME 媒体类型 application/octet-stream 的消息正文编写器

标签 web-services rest jersey java-ee-6 jax-rs

我是 RESTful webservices 的新手,正在尝试更新我的 @OneToMany来自独立客户端应用程序的关系,但我无法做到这一点。我正在使用 Glassfish 3.1.1 附带的 JAX-RS 的 Jersey 实现。

我有一个类A有一个 @OneToMany与类(class)的关系B .
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 session bean,我将其用作 RESTful Web 服务。

资源库

@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我用作 RESTful Web 服务的 EJB session bean。

一个.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

}

有人可以帮助我理解为什么会发生这种情况以及我应该如何解决这个问题吗?

最佳答案

在您的客户端代码中,您没有指定要发送的数据的内容类型 - 因此 Jersey 无法找到正确的 MessageBodyWritter 来序列化 b1 对象。

修改 main 方法的最后一行,如下所示:

ClientResponse response = resource.type(MediaType.APPLICATION_XML).put(ClientResponse.class, b1);

并将@XmlRootElement 注释添加到服务器端和客户端上的 B 类。

关于web-services - 未找到 Java 类型 myPackage.B 类和 MIME 媒体类型 application/octet-stream 的消息正文编写器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7832760/

相关文章:

web-services - Spring MVC如何成为REST框架?

rest - 如何在方法类型为 DELETE 时使用 Ext.Ajax.request 传递参数

java - 处理生成 Excel 或 PDF 文件作为响应的 REST API 中的异常的正确方法是什么?

web-services - WS 安全机制之间的区别

c# - .NET Web 服务 - 如何返回错误?

php - 如何将集成 mysql 连接到其他后关系数据?

java - 从 eclipse 导出后重命名 war 文件以命中 Web api

php - 马根托 |我如何在自定义模块的购物车中添加产品?

amazon-web-services - AWS CloudFormation 忽略现有资源

java - 有没有办法告诉 servlet 容器一次生成一个资源实例?