Джерси RS: включить объект/JSON в недействительный метод GET?

У меня есть служба 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