Java 泽西岛2例外处理

Java 泽西岛2例外处理,java,web-services,rest,jersey-2.0,Java,Web Services,Rest,Jersey 2.0,我使用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","ty

我使用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}
请帮我找出这个问题的解决办法

jersey.config.server.response.setStatusOverSendError
异常映射程序在错误对象中填充错误消息和状态。以下是异常映射程序代码:

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

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

jersey.config.server.response.setStatusOverSendError

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

jersey.config.server.response.setStatusOverSendError

为确保完整性,以下是设置所述Jersey属性的两种可选方法:

以编程方式:

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>

为确保完整性,以下是设置所述Jersey属性的两种可选方法:

以编程方式:

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>

你能分享你的例外标记代码吗?在帖子中添加例外标记代码对我来说很好。我有类似的代码,工作起来很有魅力。当JSON不正常时,您确定没有得到它吗?您能在Postman-REST客户端浏览器应用程序中试用吗?谢谢您的回复。当状态不是200时,响应不包括JSON。您正在使用哪种版本的球衣。请稍候。。。我不确定我看得是否清楚,但是否有建筑商;在generateResponse方法中?它是ExceptionMapper的成员方法吗?我使用的是Jersey 2.7,你能分享你的ExceptionMapper代码吗?在帖子中添加ExceptionMapper代码对我来说很好。我有类似的代码,工作起来很有魅力。当JSON不正常时,您确定没有得到它吗?您能在Postman-REST客户端浏览器应用程序中试用吗?谢谢您的回复。当状态不是200时,响应不包括JSON。您正在使用哪种版本的球衣。请稍候。。。我不确定我看得是否清楚,但是否有建筑商;在generateResponse方法中?它是ExceptionMapper的成员方法吗?我正在用运动衫2.7谢谢。我想补充一点,任何人都不应该在Jersey 2上使用Jersey 1的ClientResponse,因为它将忽略此属性响应\u SET\u STATUS\u OVER\u SEND\u错误。当直接返回客户端响应时,该属性也将被忽略,如下所示:@POST public response postData{return ClientBuilder.newClient.targetURI.path/.POST;}谢谢。我想补充一点,任何人都不应该在Jersey 2上使用Jersey 1的ClientResponse,因为它将忽略此属性响应\u SET\u STATUS\u OVER\u SEND\u错误。当直接返回客户端响应时,该属性也将被忽略,如下所示:@POST public response postData{return ClientBuilder.newClient.targetURI.path/.POST;}