简体   繁体   中英

Return exception from JAX-RS Rest Service as JSON

Is it in some way possible that an exception thrown from a rest service is returned as JSON? I have a JAX-RS Rest Service where I would like to achieve this. When I throw it now, it's mapped to an HTML response, which is not what i want. From what I have understood an ExceptionMapper will also map it to HTML? Is there any other alternative or libraries that allows the exception to be returned in JSON format?

It will respond as 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;
    }
}

You can create custom exception,It takes JSON request and response

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

Create One POJO BetResponseDetails

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

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

catch your exceptions, then build a response object in a standardized format such as

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

And send it as a response with an error status (from Response.Status, usually 4xx or 5xx)

get the response data in a structure with status and data, if the status is error, show the correct message. you can try this way

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

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM