使用Java / Jersey返回404响应时,为什么会得到静态text / html?

马克西姆·T

我正在使用托管在Google App Engine上的Java,Jetty和Jersey 2.18(目前最新)。

假设我有一项服务

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/{userId}")
public Response getUser(@PathParam("userId") String userId)
{
    ...
}

当我做:

    return Response.ok()
            .entity(user)
            .build();

我正确地收到了一个application / json内容类型和主体。但是当我这样做时:

    return Response
            .status(404)
            .entity(new ResponseModel(100, "user not found"))
            .build();

与返回任何4XX或5XX状态一样,我收到一个text / html内容类型以及以下HTML正文:

<html>
  <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <title>404 Not Found</title>
  </head>
  <body text=#000000 bgcolor=#ffffff>
    <h1>Error: Not Found</h1>
  </body>
</html>

而不是我放入.entity()的对象

编辑:这是我的web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app
    version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.mypackage.services;org.codehaus.jackson.jaxrs</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>
                org.glassfish.jersey.server.gae.GaeFeature;
                org.glassfish.jersey.server.mvc.jsp.JspMvcFeature;
                org.glassfish.jersey.media.multipart.MultiPartFeature;
            </param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.config.feature.Trace</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/rest/*</url-pattytern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>home.jsp</welcome-file>
    </welcome-file-list>

    <filter>
        <filter-name>ObjectifyFilter</filter-name>
        <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ObjectifyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- Spring Security Filter -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml  </param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <filter>
        <filter-name>GlobalResponseFilter</filter-name>
        <filter-class>com.mypackage.GlobalResponseFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>GlobalResponseFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>everything</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>

    <!-- ** -->
    <!-- ** General session timeout in minutes -->
    <!-- ** -->

    <session-config>
        <session-timeout>1440</session-timeout>
    </session-config>    
</web-app>

ResponseModel只是一个基本的可序列化的Java类:

import java.io.Serializable;


public class ResponseModel implements Serializable
{
    private static final long   serialVersionUID    = 1L;

    private int                 code;
    private Serializable        data;

    public ResponseModel()
    {
    }

    public ResponseModel(int code, Serializable data)
    {
        System.err.println("Code " + code + " : " + data);
        this.code = code;
        this.data = data;
    }

    public int getCode()
    {
        return code;
    }

    public void setCode(int code)
    {
        this.code = code;
    }

    public Serializable getData()
    {
        return data;
    }

    public void setData(Serializable data)
    {
        this.data = data;
    }
}
韦罗

您可以使用以下配置再试一次:

<servlet>
    <servlet-name>API</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    ...
    <init-param>
        <param-name>jersey.config.server.response.setStatusOverSendError</param-name>
        <param-value>true</param-value>
   </init-param>
</servlet>

标志定义Jersey在发送4xx或5xx响应状态时ServletResponse.sendError使用(flag是false)还是ServletResponse.setStatus(flag是true)。

调用ServletResponse.sendError通常会重置响应实体和标头,并返回状态文本的(text / html)错误页面。

由于您要返回自己的自定义错误实体,因此需要将此标志设置为true

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Spark Java返回静态HTML页面?

来自分类Dev

在J Meter测试脚本中,为什么我们不包括Java脚本,级联样式表,而仅包含html以检查性能测试中的响应时间?

来自分类Dev

为什么Java和Go的gzip会得到不同的结果?

来自分类Dev

为什么在使用SHFileInfo时会得到错误的SpecialFolder图标?

来自分类Dev

为什么在Swift中使用pow会得到错误的答案?

来自分类Dev

为什么以这种方式使用issubclass时会得到False?

来自分类Dev

为什么我使用Carbon会得到无效的数字?

来自分类Dev

为什么使用withMutations会得到不同的结果?

来自分类Dev

为什么使用toString方法后仍然会得到[]?

来自分类Dev

为什么使用acos会得到一个复数?

来自分类Dev

为什么在Swift中使用pow会得到错误的答案?

来自分类Dev

为什么使用此VBA会得到重复的图表粘贴?

来自分类Dev

为什么使用Carbon会得到无效的数字?

来自分类Dev

使用django / html中的静态文件进行下载可得到404

来自分类Dev

为什么在过滤器中使用 if 语句作为反对只返回时会得到不同的输出

来自分类Dev

使用Java修改HTML

来自分类Dev

Java HttpURLConnection 使用不同的链接返回相同的 HTML despita

来自分类Dev

使用Java使用HTML登录

来自分类Dev

尝试使用路由内的函数从MySql返回一行,但不会得到响应

来自分类Dev

使用fetch()返回HTML

来自分类Dev

使用com.sun.net.httpserver,为什么图像未在Java生成的html页面中显示?

来自分类Dev

为什么Java + =会得到错误的结果,如何防止这种情况?

来自分类Dev

为什么在 Java 中将字节数组转换为 BitSet 会得到错误的位表示

来自分类Dev

尝试使用URL访问下载SSRS报告时,为什么会得到500?

来自分类Dev

为什么使用以下代码会得到错误的像素颜色?

来自分类Dev

为什么在python中使用排序功能进行多级排序会得到错误的答案?

来自分类Dev

当我尝试使用Perl的substr提取git repo URL时,为什么会得到额外的]?

来自分类Dev

为什么在Android Studio中使用教程应用程序会得到“不受支持的Gradle版本”?

来自分类Dev

当我使用-1退出循环时,为什么会得到ArrayIndexOutOfBounds?

Related 相关文章

  1. 1

    如何使用Spark Java返回静态HTML页面?

  2. 2

    在J Meter测试脚本中,为什么我们不包括Java脚本,级联样式表,而仅包含html以检查性能测试中的响应时间?

  3. 3

    为什么Java和Go的gzip会得到不同的结果?

  4. 4

    为什么在使用SHFileInfo时会得到错误的SpecialFolder图标?

  5. 5

    为什么在Swift中使用pow会得到错误的答案?

  6. 6

    为什么以这种方式使用issubclass时会得到False?

  7. 7

    为什么我使用Carbon会得到无效的数字?

  8. 8

    为什么使用withMutations会得到不同的结果?

  9. 9

    为什么使用toString方法后仍然会得到[]?

  10. 10

    为什么使用acos会得到一个复数?

  11. 11

    为什么在Swift中使用pow会得到错误的答案?

  12. 12

    为什么使用此VBA会得到重复的图表粘贴?

  13. 13

    为什么使用Carbon会得到无效的数字?

  14. 14

    使用django / html中的静态文件进行下载可得到404

  15. 15

    为什么在过滤器中使用 if 语句作为反对只返回时会得到不同的输出

  16. 16

    使用Java修改HTML

  17. 17

    Java HttpURLConnection 使用不同的链接返回相同的 HTML despita

  18. 18

    使用Java使用HTML登录

  19. 19

    尝试使用路由内的函数从MySql返回一行,但不会得到响应

  20. 20

    使用fetch()返回HTML

  21. 21

    使用com.sun.net.httpserver,为什么图像未在Java生成的html页面中显示?

  22. 22

    为什么Java + =会得到错误的结果,如何防止这种情况?

  23. 23

    为什么在 Java 中将字节数组转换为 BitSet 会得到错误的位表示

  24. 24

    尝试使用URL访问下载SSRS报告时,为什么会得到500?

  25. 25

    为什么使用以下代码会得到错误的像素颜色?

  26. 26

    为什么在python中使用排序功能进行多级排序会得到错误的答案?

  27. 27

    当我尝试使用Perl的substr提取git repo URL时,为什么会得到额外的]?

  28. 28

    为什么在Android Studio中使用教程应用程序会得到“不受支持的Gradle版本”?

  29. 29

    当我使用-1退出循环时,为什么会得到ArrayIndexOutOfBounds?

热门标签

归档