找不到媒体类型= application / json的MessageBodyReader

我写了一个JAX-RS服务器,客户端都使用Jersey。 我想将我的实体集合发送给客户端,我做了以下步骤:

  1. Made实体扩展了Serializable
  2. 写了一个自定义提供程序并将其扩展为支持集合
  3. 将实体和提供者复制粘贴到客户端

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

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json, type=interface java.util.List, genericType=java.util.List. org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:225) org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:149) org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1124) org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:853) org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:812) org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:377) org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:813) org.glassfish.jersey.client.JerseyInvocation.access$600(JerseyInvocation.java:90) org.glassfish.jersey.client.JerseyInvocation$3.call(JerseyInvocation.java:693) org.glassfish.jersey.internal.Errors.process(Errors.java:315) org.glassfish.jersey.internal.Errors.process(Errors.java:297) org.glassfish.jersey.internal.Errors.process(Errors.java:228) org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424) org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:689) org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:405) org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:301) service.HotelService.getHotels(HotelService.java:30) actions.HotelAction.perform(HotelAction.java:42) MainServlet.processResponse(MainServlet.java:33) MainServlet.doPost(MainServlet.java:22) javax.servlet.http.HttpServlet.service(HttpServlet.java:641) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

服务器:

  @GET @Produces(MediaType.APPLICATION_JSON) public Response getHotelsList(@QueryParam("startDate") String startDate, @QueryParam("endDate") String endDate) { List list = hotelService.getAll(); return ResponseFactory.response(Response.Status.OK, list); } 

客户:

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

提供者:

 public class JsonProvider implements MessageBodyReader, MessageBodyWriter { @Override public boolean isReadable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { return MediaType.APPLICATION_JSON.equals(mediaType.getType()) && MediaType.APPLICATION_JSON.equals(mediaType.getSubtype()); } @Override public T readFrom(Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { Gson gson = createGson(); Reader reader = new InputStreamReader(entityStream, Charset.forName(Constants.UTF_8)); return gson.fromJson(reader, genericType); } @Override public boolean isWriteable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { return MediaType.APPLICATION_JSON.equals(mediaType.getType()) && MediaType.APPLICATION_JSON.equals(mediaType.getSubtype()); } @Override public long getSize(T t, Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { return -1; } @Override public void writeTo(T t, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { Gson gson = createGson(); JsonElement element = gson.toJsonTree(entityStream); Writer writer = null; try { writer = new OutputStreamWriter(entityStream, Charset.forName(Constants.UTF_8)); gson.toJson(element, writer); } finally { if (writer != null) { writer.flush(); } } } private Gson createGson() { return new GsonBuilder().setPrettyPrinting().create(); } 

}

 @Provider public class JsonCollection extends JsonProvider<Collection> {} @Entity @Table(name = "hotels", schema = "", catalog = "mydb") public class HotelsEntity implements HospitalityEntity{ private int idHotel; private String name; private String region; private String description; @Id @Column(name = "id_hotel") public int getIdHotel() { return idHotel; } public void setIdHotel(int idHotel) { this.idHotel = idHotel; } @Basic @Column(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @Basic @Column(name = "region") public String getRegion() { return region; } public void setRegion(String region) { this.region = region; } @Basic @Column(name = "description") public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; HotelsEntity that = (HotelsEntity) o; if (idHotel != that.idHotel) return false; if (description != null ? !description.equals(that.description) : that.description != null) return false; if (name != null ? !name.equals(that.name) : that.name != null) return false; if (region != null ? !region.equals(that.region) : that.region != null) return false; return true; } @Override public int hashCode() { int result = idHotel; result = 31 * result + (name != null ? name.hashCode() : 0); result = 31 * result + (region != null ? region.hashCode() : 0); result = 31 * result + (description != null ? description.hashCode() : 0); return result; } } 

你可以使用泽西json库:

  org.glassfish.jersey.media jersey-media-json-jackson 2.22  

或者genson:

  com.owlike genson 1.3  

很抱歉重新发布这篇文章,但我遇到了Maven项目的这个问题,发现我需要在我的pom中包含jackson-jaxrs-json-provider的依赖项:

  com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider 2.4.1  

MVN存储库: http : //mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider

您的实体类没有空构造函数,这是JAX-RS解组所需的。

看看这里:

https://blogs.oracle.com/groundside/entry/jax_rs_2_0_messagebodyreader

检查您是否注册了JSON支持媒体类型 。 你的class级路径上有jersey媒体音乐吗? 如果没有,请将此依赖项添加到您的pom.xml,请检查您的jersey版本,在此示例中我使用的是Jersey 2(2.24)

   org.glassfish.jersey.media jersey-media-moxy 2.24  

对于Gradle,添加以下依赖项:

 compile group: 'org.glassfish.jersey.media', name : 'jersey-media-moxy', version : '2.24.1'