Java 自定义类上的readEntity引发MessageBodyProviderNotFoundException

Java 自定义类上的readEntity引发MessageBodyProviderNotFoundException,java,jax-rs,Java,Jax Rs,我正在用Java为一个类开发一个RESTful API。 我正在使用JAX-RS,但我遵循了本教程。 除了我尝试执行response.readEntity(MyTable.class)以创建我创建的MyTable类的新对象时,一切都正常工作。 这适用于字符串。class将所有JSON信息作为字符串读取,但无法将其解析为自定义类的新对象。 我在这方面读了很多书,为属性设置了所有的setter和getter,并设置了一个空的构造函数,但它无法将信息解析为自定义类的新对象。我得到MessageBody

我正在用Java为一个类开发一个RESTful API。 我正在使用JAX-RS,但我遵循了本教程。 除了我尝试执行
response.readEntity(MyTable.class)
以创建我创建的
MyTable
类的新
对象时,一切都正常工作。
这适用于
字符串。class
将所有
JSON
信息作为字符串读取,但无法将其解析为自定义类的新
对象。
我在这方面读了很多书,为属性设置了所有的setter和getter,并设置了一个空的
构造函数
,但它无法将信息解析为自定义类的新对象。我得到
MessageBodyProviderNotFoundException:MessageBodyReader未找到媒体类型=应用程序/json,类型=class com.beans.MyTable,genericType=class com.beans.MyTable。
错误

MyTable.java MyClient.java MyService.java
根据链接指南,作者使用Gson创建了一个客户JSON提供程序。您需要向
客户端注册此提供程序,就像在服务器端一样

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

阅读以了解更多有关提供者的信息,以及它们如何在Jersey中用于序列化和反序列化。

是否有理由将
MyTable
包装在
GenericEntity
中?没有,我在遵循我链接的教程,并在源文件夹中提供了他那样做的方法。好的,查看会告诉我它用于在响应对象中携带类型信息,例如,选择合适的
MessageBodyWriter
。不一定需要,但也不会破坏你的代码。是的,我不敢相信我忘了。现在没有错误,但发生了一些奇怪的事情:出于测试目的打印
字符串对象
,我可以看到
MyTable对象
,但是当使用
MyTable
read
实体
直接访问时,字段为空……是的,我不知道。如果在将JSON数据作为字符串读取时获取所有JSON数据,我不确定它为什么不能与POJO一起工作。只是一个旁白(不是问题的原因),但是在这种情况下,服务器端不需要
GenericEntity
,在服务器上创建一个接受
MyTable
并发送JSON的POST端点。看看它是否有效。在接受POJO的服务器端执行的反序列化与在具有readEntityIt的客户端上执行的反序列化相同。我创建了一个
MyTable
并用
invocationBuilder.post(Entity.Entity(table,MediaType.APPLICATION_JSON))
发送它,并且能够访问另一端的
对象
属性。为了解决这个问题,我在
MyTable
类属性中添加了
@SerializedName
符号。
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());
@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)
new ClientConfig()
    .register( LoggingFeature.class )
    .register( GsonMessageBodyHandler.class )