Java 当状态代码为4xx时,GAE/J将内容类型从JSON更改为HTML
我用Java编写了一个Web API(Jersey的JAX-RS),它返回带有JSON的“403禁止”Java 当状态代码为4xx时,GAE/J将内容类型从JSON更改为HTML,java,google-app-engine,Java,Google App Engine,我用Java编写了一个Web API(Jersey的JAX-RS),它返回带有JSON的“403禁止” HTTP/1.1403禁止 内容类型:application/json;字符集=UTF-8 ... {“结果代码”:“…”} 它在本地GAE dev服务器上正常工作。然而,在真正的GAE上,内容类型从JSON更改为HTML HTTP/1.1。403禁止 内容类型:text/html;字符集=utf-8 ... 403禁止 错误:禁止 如何防止GAE更改内容类型和实体体 其他信息 我的端点
HTTP/1.1403禁止
内容类型:application/json;字符集=UTF-8
...
{“结果代码”:“…”}
它在本地GAE dev服务器上正常工作。然而,在真正的GAE上,内容类型从JSON更改为HTML
HTTP/1.1。403禁止
内容类型:text/html;字符集=utf-8
...
403禁止
错误:禁止
如何防止GAE更改内容类型和实体体
其他信息 我的端点不会引发任何异常。它返回一个响应实例。下面的代码段是一个测试端点。在本地GAE dev服务器上,此端点返回JSON。在真实的GAE上,它返回HTML。太好了
import javax.ws.rs.GET;
导入javax.ws.rs.Path;
导入javax.ws.rs.core.MediaType;
导入javax.ws.rs.core.Response;
导入javax.ws.rs.core.Response.Status;
@路径(“/test”)
公共类测试点
{
@得到
公众反应
{
返回响应
.status(status.BAD_请求)
.type(MediaType.APPLICATION\u JSON\u类型)
.entity(“{\'id\':1}”)
.build();
}
}
附加信息2 我编写了一个简单的示例代码,如下所示此代码即使在真实的GAE上也会返回JSON有什么区别
import java.io.IOException;
导入java.io.PrintWriter;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
公共类TestServlet扩展了HttpServlet
{
@凌驾
受保护的void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException
{
答复:setStatus(400);
setContentType(“application/json;charset=UTF-8”);
PrintWriter out=response.getWriter();
写出(“{\'hello\':\'world\'”);
}
}
您必须在服务上下文文件中定义自己的异常映射程序和有效负载扩展名:
<jaxrs:server id="my-resources" address="/some-context-path">
<jaxrs:serviceBeans>
<ref bean="my-resource-1" />
<ref bean="my-resource-2" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json"/>
<entry key="xml" value="application/xml"/>
</jaxrs:extensionMappings>
<jaxrs:providers>
<ref bean="jaxbProvider" />
<ref bean="my-custom-exception-mapper" />
</jaxrs:providers>
<jaxrs:features>
<cxf:logging/>
</jaxrs:features>
</jaxrs:server>
我的自定义异常映射器实现ExceptionMapper、ResponseExceptionMapper。这是一个很好的开始:我阅读了Jersey的源代码并凭直觉给出了答案 将“jersey.config.server.response.setStatusOverSendError”(jersey的一个)设置为true解决了该问题 以下是我的新web.xml的摘录
美国石油学会
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.classnames
......
jersey.config.server.response.setStatusOversender错误
真的
提到的不带web.xml的解决方案可能如下所示:
new ResourceConfig()
.property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, true);
感谢您提供的信息,但我的端点不会引发任何异常,因此异常映射程序不会捕获任何内容。关键在于本地GAE开发服务器和真正的GAE表现不同。我想知道如何防止GAE做不必要的事情。我的印象是403是您抛出的一个异常,感谢您发布代码示例。我相信通过设置JAX-RS允许用于响应内容类型的扩展映射,我解决了HTML问题:
(如上所示)调用response.senderro(code)时,servlet容器通过提供web.xml中定义的错误页面来处理响应,如果没有,则为默认错误页面。也就是说,sendError总是导致一个html资源。dev服务器和生产服务器以不同的方式处理这些错误(即dev服务器不使用web.xml中定义的错误页面)。我猜您已经将jersey配置为在设置jersey响应的状态时将控制权移交给servlet。您在这里输入的配置可能会改变这一点。+1谢谢,适合我。我和我的同事也有同样的问题,你的回答节省了我们几个小时。