首页 > 解决方案 > 自定义类上的 readEntity 抛出 MessageBodyProviderNotFoundException

问题描述

我正在为一个类用 Java 开发一个 RESTful API。我正在使用 JAX-RS 我是否遵循了本教程“JAX-RS Jersey”。一切正常,除非我尝试执行response.readEntity(MyTable.class)以创建我创建的新ObjectMyTable。这适用于String.class将所有信息作为字符串读取的JSON情况,但它无法将其解析Object为我的自定义类的新内容。我已经阅读了很多这方面的内容,并且我已经为属性设置了所有的 setter 和 getter,constructor但它无法将信息解析为我的自定义类的新对象。我得到了MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json, type=class com.beans.MyTable, genericType=class com.beans.MyTable.错误。

MyTable.java

 private Integer id;
    private String name;

    public MyTable() {

    }

    public MyTable(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "MyTable [id=" + id + ", name=" + name + "]";
    }

我的客户端.java

Client client = ClientBuilder.newClient( new ClientConfig().register( LoggingFeature.class ) );
WebTarget webTarget = client.target("http://localhost:8080/App/rest").path("test");

Invocation.Builder invocationBuilder =  webTarget.request(MediaType.APPLICATION_JSON);
Response response = invocationBuilder.get();

//Does not work and gives error
MyTable table = response.readEntity(MyTable.class);
System.out.println(table.toString());

我的服务.java

@PermitAll
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response test() {
        MyTable table = new MyTable();
        table.setId(1);
        table.setName("mesa de teste");

        GenericEntity<MyTable> genericEntity = new GenericEntity<MyTable>(table, MyTable.class);
        return Response.ok().entity(genericEntity).build();
    }

错误

Exception in thread "main" org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json, type=class com.beans.MyTable, genericType=class com.beans.MyTable.
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:231)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:808)
    at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:326)
    at org.glassfish.jersey.client.InboundJaxrsResponse$1.call(InboundJaxrsResponse.java:115)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:419)
    at org.glassfish.jersey.client.InboundJaxrsResponse.runInScopeIfPossible(InboundJaxrsResponse.java:267)
    at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:112)
    at com.client.MyClient.main(MyClient.java:31)

标签: javajax-rs

解决方案


基于链接指南,作者使用 Gson 创建了一个客户 JSON 提供程序。您需要向 注册此提供程序Client,就像您在服务器端一样。

new ClientConfig()
    .register( LoggingFeature.class )
    .register( GsonMessageBodyHandler.class )

阅读Jersey 文档的第 8 章和第 9 章,了解有关提供程序的更多信息以及它们如何在 Jersey 中用于序列化和反序列化。


推荐阅读