2016-11-30 55 views
9

Próbuję zwrócić obiekty ArrayList of Response z mojego punktu końcowego odpoczynku.Zwracanie listy javax.ws.rs.core.Response skutkującej 500

Aby to zrobić ja owijania mój wynik ustawić wewnątrz obiektu Generic Entity

try { 
    GenericEntity<List<Response>> response = new GenericEntity<List<Response>>(responses) { 
    }; 
    return Response.ok(response).build(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Bez względu na to, co staram dostaję 500 tyłu, który jest frustrujące. Czy istnieje sposób, w jaki mogę uzyskać bardziej definitywną odpowiedź na pytanie, dlaczego tak się nie dzieje? Adnotacje użyte dla mojej metody są następujące;

@POST 
@Path("restendpoint") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 

Dzięki

edit

Po dodaniu mapowania niestandardowe wyjątku widzę ten błąd jest z powodu tego

javax.ws.rs.WebApplicationException: HTTP 500 Internal Server Error 
    at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.writeTo(MOXyJsonProvider.java:951) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 
    at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:106) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:86) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130) 
    at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:711) 
    at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:444) 
    at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:434) 
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:329) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
    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:267) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) 
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:769) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1125) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1059) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 
    at org.eclipse.jetty.server.Server.handle(Server.java:497) 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:248) 
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:610) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:539) 
    at java.lang.Thread.run(Thread.java:744) 
Caused by: javax.xml.bind.MarshalException 
- with linked exception: 
[Exception [EclipseLink-25007] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.XMLMarshalException 
Exception Description: A descriptor for class org.glassfish.jersey.message.internal.OutboundJaxrsResponse was not found in the project. For JAXB, if the JAXBContext was bootstrapped using TypeMappingInfo[] you must call a marshal method that accepts TypeMappingInfo as an input parameter.] 
    at org.eclipse.persistence.jaxb.JAXBMarshaller.marshal(JAXBMarshaller.java:487) 
    at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.writeTo(MOXyJsonProvider.java:949) 
    ... 40 more 
Caused by: Exception [EclipseLink-25007] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.XMLMarshalException 
Exception Description: A descriptor for class org.glassfish.jersey.message.internal.OutboundJaxrsResponse was not found in the project. For JAXB, if the JAXBContext was bootstrapped using TypeMappingInfo[] you must call a marshal method that accepts TypeMappingInfo as an input parameter. 
    at org.eclipse.persistence.exceptions.XMLMarshalException.descriptorNotFoundInProject(XMLMarshalException.java:154) 
    at org.eclipse.persistence.internal.oxm.Context$ContextState.getSession(Context.java:137) 
    at org.eclipse.persistence.oxm.XMLContext$XMLContextState.getSession(XMLContext.java:798) 
    at org.eclipse.persistence.oxm.XMLContext$XMLContextState.getSession(XMLContext.java:1) 
    at org.eclipse.persistence.internal.oxm.Context.getSession(Context.java:458) 
    at org.eclipse.persistence.oxm.XMLContext.getSession(XMLContext.java:366) 
    at org.eclipse.persistence.oxm.XMLContext.getSession(XMLContext.java:1) 
    at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:582) 
    at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshalStreamOrWriter(XMLMarshaller.java:1126) 
    at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:934) 
    at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:877) 
    at org.eclipse.persistence.jaxb.JAXBMarshaller.marshal(JAXBMarshaller.java:483) 
    ... 41 more 
+1

Jest to możliwe, że moxy nie wie jak serializować listę do Json. Jednym prostym rozwiązaniem jest użycie JSON-P i samodzielne zajęcie się serializacją. W JavaEE 8 będzie standaryzowany (JSR 367) – simdevmon

Odpowiedz

3

Jak @simdevmon stwierdził, javax.ws.rs.core.Response nie zamierzam Pracuj dla swoich celów, ponieważ po wywołaniu metody build() utworzy ona onse (OutboundJaxrsResponse), którego Jersey używa do wysyłania klientowi.

Oznacza to, że Jersey domyślnie nie rozumie, jak marszałka/unmarshal jego właściwości, gdy odpowiedź jest wysyłana przez serwer.

Jeśli trzeba tylko odpowiedź listy obiektów w wyniku JSON, innym odpowiednim rozwiązaniem byłoby stworzenie klasy otoki na liście (bez końcowego pól ani konstruktorów):

import javax.ws.rs.core.Response; 

public class MyResponse { 

    private List<Response> responses; 

    public List<Response> getResponses() { 
     return responses; 
    } 

    public void setResponses(List<Response> responses) { 
     this.responses = responses; 
    } 

} 

i rozmowa reszta obsłużyć Ten obiekt zamiast:

try { 
    List<Response> responses = new ArrayList<>(); 
    responses.add(Response.ok().build()); 
    responses.add(Response.notModified().build()); 
    responses.add(Response.noContent().build()); 

    MyResponse myResponse = new MyResponse(); 
    myResponse.setResponses(responses); 

    return Response.ok(new GenericEntity<MyResponse>(myResponse) {}).build(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

to będzie generować następujące dane wyjściowe JSON:

{ 
    "responses": [ 
    "OutboundJaxrsResponse{status=200, reason=OK, hasEntity=false, closed=false, buffered=false}", 
    "OutboundJaxrsResponse{status=304, reason=Not Modified, hasEntity=false, closed=false, buffered=false}", 
    "OutboundJaxrsResponse{status=204, reason=No Content, hasEntity=false, closed=false, buffered=false}" 
    ] 
} 
3

Można również zrobić tak jak poniżej (Uwaga zależność jersey-media-json-jackson), który dodawany jest dodatkowy aby Lista powrocie pracom

Kod:

@GET 
    @Path("getListRes") 
    @Produces("application/json") 
    public Response getListResponse() { 

     List<Response> responses = new ArrayList<>(); 
     responses.add(Response.ok().build()); 
     responses.add(Response.notModified().build()); 
     responses.add(Response.noContent().build()); 
     GenericEntity<List> list = new GenericEntity<List> (responses) {}; 
     return Response.status(200).entity(list).build(); 

    } 

zależność pom.xml

<!-- Jersey 2.19 --> 
     <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-servlet</artifactId> 
      <version>${jersey2.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.core</groupId> 
      <artifactId>jersey-server</artifactId> 
      <version>${jersey2.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.core</groupId> 
      <artifactId>jersey-client</artifactId> 
      <version>${jersey2.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.code.gson</groupId> 
      <artifactId>gson</artifactId> 
      <version>2.2.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.media</groupId> 
      <artifactId>jersey-media-json-jackson</artifactId> 
      <version>2.24.1</version> 
     </dependency> 

Dane wyjściowe: http://jerseyexample-ravikant.rhcloud.com/rest/jws/getListRes