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