Изменение типа контента в REST-сервисе jax-rs - PullRequest
13 голосов
/ 05 апреля 2011

Простите, но я, возможно, не знаком со всеми языками, необходимыми для правильной постановки этого вопроса.

Я работаю над довольно простым веб-сервисом REST на Java с использованием org.apache.cxf.jaxrs.ext реализации jax-rs.Заголовок метода выглядит следующим образом:

@GET
@Path("json/{fullAlias}")
@Produces({"application/json"})
public String json(@PathParam("fullAlias") String fullAlias, @Context MessageContext req)

, где MessageContext равен org.apache.cxf.jaxrs.ext.MessageContext.

Я пытаюсь выполнить две вещи, которые, похоже, не могу понять:

  1. Измените тип содержимого, если выполняются определенные условия (например, для ошибки)
  2. Изменить код состояния ответа

Я пытался использовать изменение ответа путем доступа к нему через MessageContext:

HttpServletResponse response = req.getHttpServletResponse();
response.setContentType("text/plain")
response.setStatus("HttpServletResponse.SC_BAD_REQUEST);

Но эти измененияне имеют отношения к отправленному ответу;с аннотацией @Produces или без нее, установка типа контента внутри метода не влияет на фактический тип контента (с аннотацией, конечно, возвращается «application / json», без значения по умолчанию «text / html»).

Я возвращаю простую строку в качестве тела.Я развлекался, пытаясь вернуть объект javax.ws.rs.core.Response, чтобы делать то, что я хочу, но я не знаю много об этом.

Как бы я изменил тип контента и / иликоды состояния внутри этого метода?

Ответы [ 3 ]

29 голосов
/ 05 апреля 2011

Один из подходов заключается в создании исключения WebApplicationException, как описано в Pace, которое будет работать, если вы хотите специально обработать условие ошибки. Если вы ищете возможность изменить свой контент в любое время по любой причине, то вам нужно будет посмотреть ответ на запрос в результате использования метода обслуживания, а не строки. Возврат ответа дает вам максимальный контроль над тем, как ваша служба отвечает на запрос клиента (для этого требуется больше кода, чем для возврата простой строки).

Вот пример того, как вы можете использовать объект Response:

@GET
@Path("json/{fullAlias}")
public Response json(@PathParam("fullAlias") String fullAlias, @Context MessageContext req) {
    ...
    if (success) {
        ResponseBuilder rBuild = Response.ok(responseData, MediaType.APPLICATION_JSON);
        return rBuild.build();
    }
    else {
        ResponseBuilder rBuild = Response.status(Response.Status.BAD_REQUEST);
        return rBuild.type(MediaType.TEXT_PLAIN)
                     .entity("error message")
                     .build();
    }    
}
1 голос
/ 05 апреля 2011

Я не уверен, что это лучший подход, но я сделал следующее, чтобы решить ваш вопрос № 1.

public WebApplicationException createStatusException(String statusMessage) {
    ResponseBuilder rb = Response.noContent();
    rb = rb.type(MediaType.TEXT_PLAIN);
    rb = rb.status(Status.BAD_REQUEST);
    rb = rb.entity(statusMessage);
    return new WebApplicationException(rb.build());
}

РЕДАКТИРОВАТЬ: Затем я бросил получившийся WebApplicationException.

0 голосов
/ 17 июля 2017

Вы можете написать свой собственный фильтр ответов для изменения заголовка типа контента.

@Provider
public class MimeAddingFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
        throws IOException {
        responseContext.getHeaders().add("Content-Type", "image/png");
    }

}

Этот фильтр добавит заголовок типа контента "image / png".Вы также можете изменить или удалить заголовки в фильтрах ответов JAX-RS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...