gpt4 book ai didi

java - HTTPServletResponse 状态代码不在 HTTP 响应 header 中

转载 作者:行者123 更新时间:2023-12-02 07:40:33 25 4
gpt4 key购买 nike

我有非常简单的 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 中的状态代码根本没有改变,尽管它是手动设置的。为什么会出现这种情况?我花了很多时间谷歌搜索但没有任何结果。

诸如返回 Response 对象之类的解决方法,如下所示:

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

完美运行!

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

最佳答案

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

这是发生的事情:

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

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

  • 返回的 String 方法意味着 200 响应代码(void 意味着 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 控制如何将其呈现为响应。 .

关于java - HTTPServletResponse 状态代码不在 HTTP 响应 header 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11671190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com