繁体   English   中英

HTTPServletResponse状态代码不在HTTP响应标头中

[英]HTTPServletResponse status code is not in HTTP response header

我有非常简单的JAX-RS WS:

@Stateless
@Path("/foo")
public class FooFacadeBean {     

    @GET
    @Produces(MediaType.TEXT_HTML)
    public String performFooCall(@Context HttpServletRequest request, @Context HttpServletResponse response) {
        response.setStatus(500);
        return "Hello";
    }
}

部署后,我执行:curl -v localhost:8080 / foo,结果是:

About to connect() to localhost port 8080
Trying 127.0.0.1...
connected
Connected to localhost (127.0.0.1) port 8080
GET /foo HTTP/1.1
User-Agent: curl/7.26.0
Host: localhost:8080
Accept: */

HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.2 Java/Sun Microsystems Inc./1.6)
Server: GlassFish Server Open Source Edition 3.1.2
Content-Type: text/html
Transfer-Encoding: chunked
Date: Thu, 26 Jul 2012 13:52:10 GMT

Hello 

Connection to host localhost left intact
Closing connection

如您所见,尽管HTTP状态代码是手动设置的,但它根本没有改变。 为什么会这样? 我花了很多时间在Google搜索上没有任何结果。

这样的解决方法是返回Response对象,如下所示:

Response.status(404).entity("Hello").build();

完美的作品!

Glassfish使用JERSEY作为JAX-RS实现。 我使用Glassfish的嵌入式变体。

基本上,这不是应该使用Jersey的方式。

这是正在发生的事情:

  • 该方法将执行,并且您与ServletResponse交互并将状态代码设置为500。但是由于您没有写入任何数据,因此不会提交响应。

  • 然后,该方法返回一个String值。 由于Jersey无法知道您是否已与ServletResponse进行交互,因此它的行为正常。

  • 返回的String方法表示200响应代码(无效表示204等)。 Jersey尝试最终通过在响应实例上调用setStatus(200)来将响应代码设置为默认值。 由于尚未提交响应,因此这不是问题,将响应500更改为200。

  • HttpServletResponse已提交并发送回客户端。

我假设您想做的是返回一个不同的状态代码,但仅在特殊情况下。 这样做的方法是在正常情况下返回String,然后在特殊情况下抛出WebApplicationException

@GET
@Produces(MediaType.TEXT_HTML)
public String performFooCall() {
    if (isNormal()) {
        return "Hello";
    }
    throw new WebApplicationException(Response.status(500).entity("Hello").build());
}

另外,您可以引发标准异常,并使用单独的ExceptionMapper控制如何将其呈现为响应。

Jersey建立了新的响应,因此稍后在代码中设置响应代码。 您必须在代码中构建一个新的响应,然后在响应中添加字符串(并更改其返回值),或者您可以创建一个过滤器,该过滤器稍后将在过滤器跟踪中工作并更改响应状态。

在这里查看更多详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM