【问题标题】:Return exception from JAX-RS Rest Service as JSON从 JAX-RS Rest Service 以 JSON 形式返回异常
【发布时间】:2016-07-27 19:56:53
【问题描述】:

从休息服务抛出的异常是否有可能以 JSON 形式返回?我有一个 JAX-RS 休息服务,我想在其中实现这一点。当我现在抛出它时,它被映射到一个 HTML 响应,这不是我想要的。据我了解,ExceptionMapper 也会将其映射到 HTML?是否有任何其他替代方案或库允许以 JSON 格式返回异常?

【问题讨论】:

  • 如果您使用的是spring,请尝试使用注释。@ResponseStatus(value="HttpStatus.XXXXXXXXX",reason"blah blah") @ExceptionHandler(MyExceptionException.class) ..

标签: java json rest exception jax-rs


【解决方案1】:

它将以 JSON 格式响应。

@Provider
@Singleton
public class ExceptionMapperProvider implements ExceptionMapper<Exception>
{

    @Override
    public Response toResponse(final Exception exception)
    {
            return Response.status(HttpStatusCodes.STATUS_CODE_SERVER_ERROR).entity(new BasicResponse(InternalStatus.UNHANDLED_EXCEPTION, exception.getMessage())).type(MediaType.APPLICATION_JSON).build();    
    }
}

@XmlRootElement
public class BasicResponse {

    public String internalStatus;

    public String message;

    public BasicResponse() {}

    public BasicResponse(String internalStatus, String message){
        this.internalStatus = internalStatus;
        this.message = message;
    }
}

【讨论】:

  • 谢谢。问题是 REST 服务返回 f.ex。 GET 请求的对象列表。当错误需要返回的是 Response 对象时,我该如何处理?
  • 我不明白你的问题,请提供更多细节。 ExceptionMapper 应该捕获服务中的任何异常类型并返回带有 Http 状态和 Json 错误消息的响应。
  • 我的意思是我的 Rest 服务返回自定义对象的列表,而这个错误处理返回一个不符合我的方法签名的 Response 对象。我想我需要改变,以便我返回一个 Response 对象。另一方面,这在我的 POST 方法中可能有点问题,现在这些方法是无效的。希望这更清楚:)
  • 如果出现异常情况,您将不会返回自定义对象的常见响应或无效。您需要返回带有特定消息的错误。因此,您可以保留方法签名,但异常映射器将返回响应类型。您还可以在异常映射器中指定如何处理特定的异常类型。
【解决方案2】:

您可以创建自定义异常,它需要 JSON 请求和响应

    @POST
    @Path("/betRequest")
    @Consumes({ "application/json", "application/x-www-form-urlencoded" })
    @Produces({ "application/json", "application/x-www-form-urlencoded" })
    public Response getBetRequest(String betRequestParams, @Context HttpServletRequest request) 
    {
      BetResponseDetails  betResponseDetails = new BetResponseDetails();
      try{
           //you code here
          }
      catch (JSONException ex) 
         {
            ex.printStackTrace();
            betResponseDetails.setResponseCode("9002");//your custom error code
            betResponseDetails.setResponseStatus("Bad Request");//custom status
            betResponseDetails.setResponseMessage("The request body contained invalid JSON");//custom error massage
            return Response.status(200).entity(betResponseDetails).build();
        }
     }

创建一个 POJO BetResponseDetails

public class BetResponseDetails {
    private String ResponseStatus;
    private String ResponseCode;
    private String ResponseMessage;

  // getter/setter
 .......
}

【讨论】:

    【解决方案3】:

    在包含状态和数据的结构中获取响应数据,如果状态为错误,则显示正确的消息。 你可以试试这个方法

    {
    "status": "error",
    "data": {
        "message": "information of error message"
    }
    

    }

    【讨论】:

      【解决方案4】:

      捕获您的异常,然后以标准化格式构建响应对象,例如

      error: {
          code: 'XXX',
          status: HTTPStatus,
          message: 'my error message'
      }
      

      并将其作为带有错误状态的响应发送(来自 Response.Status,通常为 4xx 或 5xx)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-26
        • 2016-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多