java - 自定义类上的 readEntity 抛出 MessageBodyProviderNotFoundException
问题描述
我正在为一个类用 Java 开发一个 RESTful API。我正在使用 JAX-RS 我是否遵循了本教程“JAX-RS Jersey”。一切正常,除非我尝试执行response.readEntity(MyTable.class)
以创建我创建的新Object
类MyTable
。这适用于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)
解决方案
基于链接指南,作者使用 Gson 创建了一个客户 JSON 提供程序。您需要向 注册此提供程序Client
,就像您在服务器端一样。
new ClientConfig()
.register( LoggingFeature.class )
.register( GsonMessageBodyHandler.class )
阅读Jersey 文档的第 8 章和第 9 章,了解有关提供程序的更多信息以及它们如何在 Jersey 中用于序列化和反序列化。
推荐阅读
- python-3.x - 如何在python中处理一个不存在的文件
- c++ - 将对象推送到 shared_ptr 的错误
队列 - ffmpeg - 如何学习 h264_nvenc 编码器的有效质量?
- python - SciPy cdist 速度差异
- java - jenkins sonarqube 扫描仪以非零代码 1 错误退出
- android - 如何显示警报按钮?
- python - 嵌套 JSON:pandas.json_normalize 和错误不可散列类型:'dict'
- javascript - 如何更改滑块中标签的值(材质ui)?
- python - 如何从字典中获取数据集名称值以进行操作
- angular - 如何使用 xepOnline 获取 base64 图像