我已经写了一个JAX-RS服务器和客户端都使用泽西.我想把我的实体收集到客户端,我做了以下步骤:
>实体扩展Serializable
编写一个自定义提供程序并扩展它以支持集合
>将实体和提供者复制粘贴到客户端
我提出请求,它在服务器端成功处理客户端收到错误:
- 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>.
- 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<HotelsEntity> list = hotelService.getAll();
- return ResponseFactory.response(Response.Status.OK,list);
- }
客户:
- GenericType<List<HotelsEntity>> genericType = new GenericType<List<HotelsEntity>>(){};
- WebTarget target = client.target(preparePath());
- List<HotelsEntity> hotels = target.request(MediaType.APPLICATION_JSON_TYPE).get(genericType);
提供者:
- public class JsonProvider<T> implements MessageBodyReader<T>,MessageBodyWriter<T> {
- @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<T> type,MediaType mediaType,MultivaluedMap<String,String> 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,MediaType mediaType) {
- return MediaType.APPLICATION_JSON.equals(mediaType.getType()) &&
- MediaType.APPLICATION_JSON.equals(mediaType.getSubtype());
- }
- @Override
- public long getSize(T t,Class<?> type,MediaType mediaType) {
- return -1;
- }
- @Override
- public void writeTo(T t,Object> 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<? extends HospitalityEntity>> {}
- @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;
- }
- }
解决方法
你可以使用jersey json库:
- <dependency>
- <groupId>org.glassfish.jersey.media</groupId>
- <artifactId>jersey-media-json-jackson</artifactId>
- <version>2.22</version>
- </dependency>
或genson:
- <dependency>
- <groupId>com.owlike</groupId>
- <artifactId>genson</artifactId>
- <version>1.3</version>
- </dependency>