简体   繁体   English

返回javax.ws.rs.core.Response的列表,结果为500

[英]Returning a list of javax.ws.rs.core.Response resulting in 500

I am trying to return an ArrayList of Response objects from my rest end point. 我试图从我的休息终点返回一个ArrayList of Response对象。

To do so I am wrapping my result set inside of a Generic Entity object 为此,我将结果集包装在通用实体对象中

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

No matter what I try I get a 500 back which is frustrating. 无论我尝试什么,我都会得到500的回扣,这令人沮丧。 Is there a way I can get a more definitive answer as to why this is failing? 有什么办法可以使我得到更明确的答案,为什么会失败呢? The annotations used for my method are as follows; 我的方法使用的注释如下:

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

Thanks 谢谢

edit 编辑

After adding a custom exception mapper i can see the error is because of this 添加自定义异常映射器后,我可以看到错误是因为

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

As @simdevmon stated, javax.ws.rs.core.Response is not gonna work for your purposes because once you call build() method, it'll create an outgoing response ( OutboundJaxrsResponse ) that Jersey uses to send to a client. 如@simdevmon所述, javax.ws.rs.core.Response不能满足您的目的,因为一旦调用build()方法,它将创建一个外发响应( OutboundJaxrsResponse ),Jersey使用该响应来发送给客户端。

This implies that Jersey won't understand, by default, how to marshal/unmarshal its properties when the response is sent through the server. 这意味着默认情况下,当通过服务器发送响应时,Jersey将不了解如何封送/取消封送其属性。

If you only need the response objects list as a JSON result, another suitable solution would be creating a wrapper class for your list (without final fields nor constructors): 如果只需要将响应对象列表作为JSON结果,则另一个合适的解决方案是为列表创建包装器类(没有最终字段或构造函数):

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;
    }

}

and your rest call to handle this object instead: 而您的rest调用则改为处理此对象:

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();
}

This will generate the following JSON output: 这将生成以下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}"
  ]
}

You can also do as below (Note the dependency of jersey-media-json-jackson ) which is added extra to make List returning work 您还可以执行以下操作(请注意jersey-media-json-jackson的依赖项),该添加项是为了使List返回工作而额外添加的

Code : 代码:

@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();

    }

Pom.xml dependency 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>

Output at : http://jerseyexample-ravikant.rhcloud.com/rest/jws/getListRes 输出在: http : //jerseyexample-ravikant.rhcloud.com/rest/jws/getListRes

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 HttpServletResponse 到 javax.ws.rs.core.Response - HttpServletResponse to javax.ws.rs.core.Response 如何在javax.ws.rs.core.Response中设置Response body - How set Response body in javax.ws.rs.core.Response Java JMX调用方法返回javax.ws.rs.core.Response对象不起作用(获取NotSerializableException) - Java JMX invoking method returning javax.ws.rs.core.Response object not working (get NotSerializableException) 使用 javax.ws.rs.core.Response 和断言的模拟方法 - Mocking method with javax.ws.rs.core.Response and assertion JERSEY-将javax.ws.rs.core.Response作为JSON对象返回,错误为:…或令牌: - JERSEY - returning javax.ws.rs.core.Response as a JSON object with either error:… or token: 如何解析 javax.ws.rs.core.Response - How to Parse javax.ws.rs.core.Response 如何在Java中将哈希集添加到javax.ws.rs.core.Response - how to add a Hashset to a javax.ws.rs.core.Response in java 以集合为实体的javax.ws.rs.core.Response - javax.ws.rs.core.Response with a collection as entity 如何从JAX-RS javax.ws.rs.core.Response获取原始请求的URI - How to get the original requested URI from JAX-RS javax.ws.rs.core.Response 方法public javax.ws.rs.core.Response缺少依赖项(上传文件JAX-RS) - Missing dependency for method public javax.ws.rs.core.Response (Upload File JAX-RS)
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM