【问题标题】:Jersey 2.5 as filter http status 404Jersey 2.5 作为过滤器 http 状态 404
【发布时间】:2015-02-11 20:07:45
【问题描述】:

我已部署 Jersey 2.5 应用程序作为过滤器,但在访问此(或任何资源)url 时出现 HTTP 状态 404 - Not Found 错误:

localhost:8080/[appname]/rest/users/new

此 URL 以前在应用程序部署为 servlet 时有效。如果我将“过滤器”标签转换为“servlet”标签,该网址将再次起作用。

启动时也不例外,之前设置的断点不再被触发。就好像找不到资源类一样。知道可能出了什么问题吗?

我的 web.xml:

<filter>
    <filter-name>jerseywebapp</filter-name>
    <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.[pkg].resources</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>
            org.glassfish.jersey.media.multipart.MultiPartFeature, 
            org.glassfish.jersey.server.mvc.jsp.MvcFeature, 
            org.glassfish.jersey.server.mvc.jsp.JspMvcFeature, 
            org.glassfish.jersey.jackson.JacksonFeature
        </param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.mvc.templateBasePath.jsp</param-name>
        <param-value>/WEB-INF/views</param-value>
    </init-param>
     <!-- 
    <load-on-startup>1</load-on-startup>
     -->
</filter>
<filter-mapping>
    <filter-name>jerseywebapp</filter-name>
    <url-pattern>/rest/*</url-pattern>
</filter-mapping>

【问题讨论】:

  • Jersey JSP MVC 模板的限制想要使用 JSP 模板支持的 Jersey Web 应用程序应该在应用程序的 web.xml 中注册为 Servlet 过滤器而不是 Servlet。对于需要使用 Jersey MVC 模板支持的 Web 应用程序,目前不支持 Servlet 3.0 中引入的 web.xml-less 部署样式。
  • 冒着放弃未解决问题的风险,我必须报告我正在将 Jersey 作为 Servlet 运行,并且一切正常。
  • @broadbear,您是否找到过解决方案或有关此问题的更多信息?

标签: java rest servlet-filters jersey-2.0


【解决方案1】:

根据我的经验,将 service 标签更改为 filter 标签的效果相同,但需要注意的是,@Path("...") 注释将假定在 @987654324 的上下文中匹配@。您必须手动将模式添加到路径注释中。

例如,在web.xml 中使用此 XML:

...
<servlet-mapping>
    <servlet-name>jerseywebapp</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

使用此配置,您可以期望在/rest/test/ping 处获得与此路径注释的匹配:

@Path("test")
public class Test {

   @GET
   @Path("ping")
   public Response getPing() {
      ....
   }

现在,如果我们切换到使用filter 标签:

...
<filter-mapping>
    <filter-name>jerseywebapp</filter-name>
    <url-pattern>/rest/*</url-pattern>
</filter-mapping>

请注意,要在 /rest/test/ping 处仍然到达我们的端点,我们需要将我们的类 @Path 注释从 "test" 更改为 "rest/test"

@Path("rest/test")
public class Test {

   @GET
   @Path("ping")
   public Response getPing() {
      ....
   }

【讨论】:

  • 部署为 servlet 时一切正常,因此我从不费心让过滤器部署工作。我接受了这个答案,因为它看起来很相关并且可能是很好的信息。
猜你喜欢
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多