Jersey RS: Включване на обект/JSON в метода void GET?

Имам услуга на Jersey REST и бих искал да имам метод GET, който връща void при успех, но връща обект ErrorResponse, ако има проблем. Ето как изглежда моят метод:

@GET
@Path(ResourceConstants.PATH_START_BATCH)
@Produces(MediaType.APPLICATION_JSON)
public void startBatch(@QueryParam(ResourceConstants.PARAM_BATCH_ID) String batchId)
{
    try
    {
        batchService.startBatch(batchId);
    }
    catch (Exception ex)
    {
        ErrorResponse errorResponse = new ErrorResponse();
        Map<String, String> responseDetails = errorResponse.getResponseDetails();
        responseDetails.put("Failure", "Failed to start with exception " + ex.getMessage());

        throw WebServiceException.generate(ex, errorResponse);
    }
}

и класът WebServiceException изглежда така:

public class WebServiceException extends WebApplicationException
{
    private static final long serialVersionUID = 1L;

    public WebServiceException(ErrorResponse errorResponse)
    {
        super(Response.serverError()
                .status(Status.INTERNAL_SERVER_ERROR)
                .entity(errorResponse)
                .type(MediaType.APPLICATION_JSON)
                .build());
    }

    public WebServiceException(Throwable throwable, Response response)
    {
        super(throwable, response);
    }

    public static WebServiceException generate(Throwable throwable, ErrorResponse errorResponse)
    {
        Throwable rootCause = WebServiceException.getRootCause(throwable);

        Response response = Response.serverError()
                .status(Status.INTERNAL_SERVER_ERROR)
                .entity(errorResponse)
                .type(MediaType.APPLICATION_JSON)
                .build();

        return new WebServiceException(rootCause, response);
    }

    private static Throwable getRootCause(Throwable current)
    {
        Throwable root = current.getCause();

        if (root != null)
        {
            return WebServiceException.getRootCause(root);
        }
        else
        {
            return current;
        }
    }
}

Когато тествам с невалиден идентификатор на партида, отговорът ми е празен набор от празни скоби {}.

Мога ли да върна JSON обект в грешката, ако методът върне void?


person sdoca    schedule 19.06.2014    source източник


Отговори (1)


Направи така:

@GET
@Path(ResourceConstants.PATH_START_BATCH)
@Produces(MediaType.APPLICATION_JSON)
public Response startBatch(@QueryParam(ResourceConstants.PARAM_BATCH_ID) String batchId) {
    try {
        //you code
        return Response.status(Status.NO_CONTENT).build(); //or Response.ok();
    } catch (RuntimeException ex) {

        ErrorResponse errorResponse = new ErrorResponse();
        Map<String, String> responseDetails = errorResponse.getResponseDetails();
        responseDetails.put("Failure", "Failed to start with exception " + ex.getMessage());

        return Response.status(Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build();
    }
}

По принцип не бих предложил да се връща празен отговор при GET заявка, по-добре да се използва POST.

person win_wave    schedule 23.06.2014
comment
Бях го променил, за да върна обект и това проработи. Сега имам проблеми с връщането на JSON (XML е добре). Вижте stackoverflow.com/questions/ 24334373/ - person sdoca; 23.06.2014