Покойся с миром статус ответа + тело

У меня есть следующий метод в моей службе отдыха:

    @POST
    @Path("/create")
    @ResponseStatus(HttpStatus.CREATED)
    @Consumes(MediaType.WILDCARD)
    public String create( .... ) {.... return json;}

поэтому я хочу получить ответ с json в теле и кодом состояния CREATED.

Проблема в следующем: я не могу получить ответ со статусом CREATED.

Код состояния всегда в порядке, поэтому кажется, что "@ResponseStatus(HttpStatus.CREATED)" просто игнорируется...

Может ли кто-нибудь помочь мне с этим?

Я использую hibernate 4.1, spring 3.1 и resteasy 2.3.


person golinko    schedule 20.08.2012    source источник
comment
Какое полное имя класса у @ResponseStatus?   -  person eiden    schedule 20.08.2012
comment
это org.springframework.web.bind.annotation.ResponseStatus   -  person golinko    schedule 20.08.2012


Ответы (1)


Насколько мне известно, этого невозможно добиться, аннотируя метод с помощью @org.springframework.web.bind.annotation.ResponseStatus.

Вы можете вернуть javax.ws.rs.core.Response из своего метода:

return Response
        .status(Response.Status.CREATED)
        .entity("ok")
        .build();

Или вы можете ввести org.jboss.resteasy.spi.HttpResponse и напрямую установить код состояния.

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

Рабочий тесткейс:

import org.jboss.resteasy.core.Dispatcher;
import org.jboss.resteasy.core.ServerResponse;
import org.jboss.resteasy.mock.MockDispatcherFactory;
import org.jboss.resteasy.mock.MockHttpRequest;
import org.jboss.resteasy.mock.MockHttpResponse;
import org.jboss.resteasy.spi.HttpResponse;
import org.jboss.resteasy.spi.NotFoundException;
import org.jboss.resteasy.spi.interception.PostProcessInterceptor;
import org.junit.Assert;
import org.junit.Test;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;

public class ResponseTest {


    @Path("/")
    public static class Service {
        @Context HttpResponse response;

        @GET
        @Path("/1")
        public Response createdUsingResponse() throws NotFoundException {
            return Response
                    .status(Response.Status.CREATED)
                    .entity("ok")
                    .build();
        }

        @GET
        @Path("/2")
        public String created() throws NotFoundException {
            response.setStatus(Response.Status.CREATED.getStatusCode());
            return "ok";
        }
    }

    public static class Interceptor implements PostProcessInterceptor {
        @Context HttpResponse response;

        @Override
        public void postProcess(ServerResponse response) {
            if(this.response.getStatus() != 0){
                response.setStatus(this.response.getStatus());
            }
        }
    }

    @Test
    public void test() throws Exception {
        Dispatcher dispatcher = MockDispatcherFactory.createDispatcher();
        dispatcher.getRegistry().addSingletonResource(new Service());
        dispatcher
            .getProviderFactory()
            .getServerPostProcessInterceptorRegistry()
            .register(new Interceptor());

        {
            MockHttpRequest request = MockHttpRequest.get("/1");
            MockHttpResponse response = new MockHttpResponse();

            dispatcher.invoke(request, response);

            Assert.assertEquals(201, response.getStatus());
        }
        {
            MockHttpRequest request = MockHttpRequest.get("/2");
            MockHttpResponse response = new MockHttpResponse();

            dispatcher.invoke(request, response);

            Assert.assertEquals(201, response.getStatus());
        }
    }
}
person eiden    schedule 21.08.2012