java – MessageBodyReader找不到媒体type = application / json

前端之家收集整理的这篇文章主要介绍了java – MessageBodyReader找不到媒体type = application / json前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经写了一个JAX-RS服务器和客户端都使用泽西.我想把我的实体收集到客户端,我做了以下步骤:

>实体扩展Serializable
编写一个自定义提供程序并扩展它以支持集合
>将实体和提供者复制粘贴到客户端

我提出请求,它在服务器端成功处理客户端收到错误

  1. org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json,type=interface java.util.List,genericType=java.util.List<model.HotelsEntity>.
  2. org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:225)
  3. org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:149)
  4. org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1124)
  5. org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:853)
  6. org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:812)
  7. org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:377)
  8. org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:813)
  9. org.glassfish.jersey.client.JerseyInvocation.access$600(JerseyInvocation.java:90)
  10. org.glassfish.jersey.client.JerseyInvocation$3.call(JerseyInvocation.java:693)
  11. org.glassfish.jersey.internal.Errors.process(Errors.java:315)
  12. org.glassfish.jersey.internal.Errors.process(Errors.java:297)
  13. org.glassfish.jersey.internal.Errors.process(Errors.java:228)
  14. org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
  15. org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:689)
  16. org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:405)
  17. org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:301)
  18. service.HotelService.getHotels(HotelService.java:30)
  19. actions.HotelAction.perform(HotelAction.java:42)
  20. MainServlet.processResponse(MainServlet.java:33)
  21. MainServlet.doPost(MainServlet.java:22)
  22. javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
  23. javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

服务器:

  1. @GET
  2. @Produces(MediaType.APPLICATION_JSON)
  3. public Response getHotelsList(@QueryParam("startDate") String startDate,@QueryParam("endDate") String endDate) {
  4. List<HotelsEntity> list = hotelService.getAll();
  5. return ResponseFactory.response(Response.Status.OK,list);
  6. }

客户:

  1. GenericType<List<HotelsEntity>> genericType = new GenericType<List<HotelsEntity>>(){};
  2. WebTarget target = client.target(preparePath());
  3. List<HotelsEntity> hotels = target.request(MediaType.APPLICATION_JSON_TYPE).get(genericType);

提供者:

  1. public class JsonProvider<T> implements MessageBodyReader<T>,MessageBodyWriter<T> {
  2.  
  3. @Override
  4. public boolean isReadable(Class<?> type,Type genericType,Annotation[] annotations,MediaType mediaType) {
  5. return MediaType.APPLICATION_JSON.equals(mediaType.getType()) &&
  6. MediaType.APPLICATION_JSON.equals(mediaType.getSubtype());
  7. }
  8.  
  9. @Override
  10. public T readFrom(Class<T> type,MediaType mediaType,MultivaluedMap<String,String> httpHeaders,InputStream entityStream) throws IOException,WebApplicationException {
  11. Gson gson = createGson();
  12. Reader reader = new InputStreamReader(entityStream,Charset.forName(Constants.UTF_8));
  13. return gson.fromJson(reader,genericType);
  14. }
  15.  
  16. @Override
  17. public boolean isWriteable(Class<?> type,MediaType mediaType) {
  18. return MediaType.APPLICATION_JSON.equals(mediaType.getType()) &&
  19. MediaType.APPLICATION_JSON.equals(mediaType.getSubtype());
  20. }
  21.  
  22. @Override
  23. public long getSize(T t,Class<?> type,MediaType mediaType) {
  24. return -1;
  25. }
  26.  
  27. @Override
  28. public void writeTo(T t,Object> httpHeaders,OutputStream entityStream) throws IOException,WebApplicationException {
  29. Gson gson = createGson();
  30. JsonElement element = gson.toJsonTree(entityStream);
  31. Writer writer = null;
  32. try {
  33. writer = new OutputStreamWriter(entityStream,Charset.forName(Constants.UTF_8));
  34. gson.toJson(element,writer);
  35. } finally {
  36. if (writer != null) {
  37. writer.flush();
  38. }
  39. }
  40. }
  41.  
  42. private Gson createGson() {
  43. return new GsonBuilder().setPrettyPrinting().create();
  44. }

}

  1. @Provider
  2. public class JsonCollection extends JsonProvider<Collection<? extends HospitalityEntity>> {}
  3.  
  4. @Entity
  5. @Table(name = "hotels",schema = "",catalog = "mydb")
  6. public class HotelsEntity implements HospitalityEntity{
  7. private int idHotel;
  8. private String name;
  9. private String region;
  10. private String description;
  11.  
  12. @Id
  13. @Column(name = "id_hotel")
  14. public int getIdHotel() {
  15. return idHotel;
  16. }
  17.  
  18. public void setIdHotel(int idHotel) {
  19. this.idHotel = idHotel;
  20. }
  21.  
  22. @Basic
  23. @Column(name = "name")
  24. public String getName() {
  25. return name;
  26. }
  27.  
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31.  
  32. @Basic
  33. @Column(name = "region")
  34. public String getRegion() {
  35. return region;
  36. }
  37.  
  38. public void setRegion(String region) {
  39. this.region = region;
  40. }
  41.  
  42. @Basic
  43. @Column(name = "description")
  44. public String getDescription() {
  45. return description;
  46. }
  47.  
  48. public void setDescription(String description) {
  49. this.description = description;
  50. }
  51.  
  52.  
  53. @Override
  54. public boolean equals(Object o) {
  55. if (this == o) return true;
  56. if (o == null || getClass() != o.getClass()) return false;
  57.  
  58. HotelsEntity that = (HotelsEntity) o;
  59.  
  60. if (idHotel != that.idHotel) return false;
  61. if (description != null ? !description.equals(that.description) : that.description != null) return false;
  62. if (name != null ? !name.equals(that.name) : that.name != null) return false;
  63. if (region != null ? !region.equals(that.region) : that.region != null) return false;
  64.  
  65. return true;
  66. }
  67.  
  68. @Override
  69. public int hashCode() {
  70. int result = idHotel;
  71. result = 31 * result + (name != null ? name.hashCode() : 0);
  72. result = 31 * result + (region != null ? region.hashCode() : 0);
  73. result = 31 * result + (description != null ? description.hashCode() : 0);
  74. return result;
  75. }
  76. }

解决方法

你可以使用jersey json库:
  1. <dependency>
  2. <groupId>org.glassfish.jersey.media</groupId>
  3. <artifactId>jersey-media-json-jackson</artifactId>
  4. <version>2.22</version>
  5. </dependency>

或genson:

  1. <dependency>
  2. <groupId>com.owlike</groupId>
  3. <artifactId>genson</artifactId>
  4. <version>1.3</version>
  5. </dependency>

猜你在找的Java相关文章