Return 来自 JAX-RS Rest 服务的异常 JSON

Return exception from JAX-RS Rest Service as JSON

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

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

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

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

您可以创建自定义异常,需要 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
 .......
}

获取状态和数据结构中的响应数据,如果状态错误,则显示正确的消息。 你可以这样试试

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

}

它将响应为 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;
    }
}