当前位置: 首页 > 知识库问答 >
问题:

球衣2例外处理

颜云瀚
2023-03-14

我使用Jersey 2.10异常映射器类来处理异常。我想返回错误状态和错误信息的JSON正文。我想得到类似的回应:

400 Bad Request
X-Powered-By:  Servlet/3.0
Content-Length:  152
Content-Type:  application/json
Content-Language:  en-AU
Date:  Thu, 21 Aug 2014 07:21:40 GMT

{"errors":[{"code":"LKVBS182","type":"ERROR","message":"COUNTRY NAME IS NOT DEFINED IN DATA-BASE"}],"status":"ERROR","errorStatus":"Bad Request","errorCode":400}

Jersey没有在响应中发送JSON正文。我得到的是:

400 Bad Request
Content-Length:  161
Content-Type:  text/html;charset=UTF-8
Connection:  Close
Date:  Thu, 21 Aug 2014 07:29:22 GMT

Error 400: Bad Request

如果我将状态代码更改为200,那么我将获得预期的响应正文

200 OK
X-Powered-By:  Servlet/3.0
Content-Length:  152
Content-Type:  application/json
Content-Language:  en-AU
Date:  Thu, 21 Aug 2014 07:21:40 GMT

{"errors":[{"code":"LKVBS182","type":"ERROR","message":"COUNTRY NAME IS NOT DEFINED IN DATA-BASE"}],"status":"ERROR","errorStatus":"Bad Request","errorCode":400}

请帮我找出这个问题的解决方案。

异常映射器在错误对象中填充错误消息和状态。以下是异常映射程序代码:

public Response toResponse(ServiceException exception) {
        List<MyResponseError> myErrors= exception.getMyErrors();        
        ErrorsDTO errors = new ErrorsDTO(ERROR_STATUS,myErrors);        
        return errors.generateResponse();       
    }

这是来自错误对象的代码:

public Response generateResponse() {
        if(this.errorStatus==null){
            this.errorStatus= Status.NOT_FOUND;
        }
        this.errorCode= this.errorStatus.getStatusCode();
        //TODO response status should be set to this.errroStatus. 
        //Jersey does not allow JSON response with status code other than 200
        ResponseBuilder builder = Response.status(Status.OK);
        builder.entity(this);
        builder.type(MediaType.APPLICATION_JSON);
        Response response = builder.build();
        return response;
}

共有2个答案

徐星阑
2023-03-14

将以下服务器属性设置为true可以解决此问题。

jersey.config.server.response.setStatusOverSendError
方博
2023-03-14

为了完整起见,下面是设置提到的泽西属性的两种替代方法:

以编程方式:

new ResourceConfig()
       .property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, true);

或在web内部。xml

<servlet>
  <servlet-name>jersey-serlvet</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  ....
  <init-param>
    <param-name>jersey.config.server.response.setStatusOverSendError</param-name>
    <param-value>true</param-value>
  </init-param>
</servlet>
 类似资料:
  • 我有一个运行spring-boot、jersey2和spring度量的应用程序:下面是maven片段: 在引入致动器依赖性之前,Jersey一直工作得很好。然后创建了以下bean以使Jersey作为过滤器工作: 度量被映射到/admin路径。使用这种配置,我无法使度量标准工作。但是,通过添加management.port(不同于主应用程序端口),既可以使用Jersey资源,也可以使用metrics

  • 我有一个服务器Weblogic 12.1.3,带有JAX-RS 2。x作为共享库安装(参见。https://docs.oracle.com/middleware/1213/wls/RESTF/use-jersey20-ri.htm#RESTF297). 该共享库包括例如javax。ws。rs-api-2.0。jar和jersey-media-multipart-2.5.1。jar。 请注意,我不确

  • 我需要在java上开发简单的web服务。我是java技术新手,根据几篇文章,我决定将JAX-RS(Jersey)与嵌入式http服务器(Grizzly2)结合使用,因为它看起来适合构建REST服务,部署似乎很简单。 在我的开发环境中,所有工作都很完美(使用IntllijIdea)。 但当我尝试在测试服务器上部署时,每个请求都返回“500内部错误”(偶数/application.wadl) 简单资源

  • 如spring boot博客所述 我尝试自定义我的对象序列化。 在我的配置中添加了一个新的配置bean之后 当我尝试输出类用户的实例时,json结果不在CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES中 也许我需要在我的Jersey配置中注册一些东西来激活我的自定义obejctMapper配置 谢谢

  • 我想在Grizzly 2上运行JAX-RS 2.0/jer,但我现在不知道如何设置它。我发现了以下Maven依赖项: 我需要什么Java代码才能在灰熊上运行泽西岛?

  • 问题内容: 我想创建一个类,该类的对象可以使用注释(或者在需要将参数传递给注释的情况下使用自定义注释)注入资源方法中。在泽西岛1. *中,我会使用(在我的情况下,与一起使用)。我想要实现的是来自 dropwizard的 [ 1 ] (使用Jersey 1.7)。 __ 据我所知,Jersey的注入功能已被HK2取代,我找不到我所描述的任何示例。 问题答案: 您需要从HK2 实现InjectionR