【问题标题】:HTTP Status Code 201 with multipart/mixed response具有多部分/混合响应的 HTTP 状态代码 201
【发布时间】:2012-02-14 07:44:35
【问题描述】:

我正在尝试创建一个 REST 服务,定义为:

@POST
@Path("/path")
@Consumes(MediaType.APPLICATION_XML)
@Produces("multipart/mixed")
public MultipartOutput create(MyObject o) {}

输出的第一部分是 XML,第二部分是文本文件。在 XML 中,我有我需要的状态代码,但我如何使用它来创建 HTTP 状态代码?目前我收到 200,我需要 201。

(对于其他服务,没有 MultipartOutput,使用 ResponseBuilder 创建响应)。

【问题讨论】:

  • 我投了 eiden 的答案,因为它完全解决了我最初的要求。但我最终使用了另一种解决方案:我修改了服务以返回 Response 而不是 MultipartOutput,并使用 Response.status(201).entity(mop).build(); 创建响应,其中 mop 是 MultipartOutput 对象。

标签: rest jboss resteasy


【解决方案1】:

您可以使用@Context 访问HttpServletResponse

尝试更改您的方法签名并调用setStatus

public MultipartOutput create(MyObject o, @Context HttpServletResponse response) {
    MultipartOutput mpo = ...
    response.setStatus(201);

    return mpo;
}

编辑:

尝试将org.jboss.resteasy.spi.HttpResponsePostProcessInterceptor 一起使用:

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.plugins.providers.multipart.MultipartOutput;
import org.jboss.resteasy.spi.HttpResponse;
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.MediaType;
import javax.xml.bind.annotation.XmlRootElement;

public class MultipartTest {
    @XmlRootElement(name = "MyObject")
    static class MyObject {}

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

        @GET
        @Path("/mpo")
        public MultipartOutput create() {
            response.setStatus(201);

            final MultipartOutput mpo = new MultipartOutput();
            mpo.addPart(new MyObject(), MediaType.APPLICATION_XML_TYPE);

            return mpo;
        }
    }

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

        @Override
        public void postProcess(ServerResponse serverResponse) {
            serverResponse.setStatus(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("/mpo");
        MockHttpResponse response = new MockHttpResponse();

        dispatcher.invoke(request, response);

        Assert.assertEquals(201, response.getStatus());
    }
}

【讨论】:

  • 我正在使用 JBOSS 1.5。如果我使用@Context HttpServletResponse,我会收到javax.servlet.ServletException: non-HTTP request or response(参见stackoverflow.com/questions/5117121/…
猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 2016-01-18
  • 2018-02-19
  • 2017-09-26
  • 2016-04-14
  • 2017-03-15
  • 2017-05-10
  • 2018-04-05
相关资源
最近更新 更多