JAX-RS:以斜杠(/)结尾的路径导致404错误

时间:2012-02-14 14:35:13

标签: jersey jax-rs

尝试在http://localhost:8080/enterprise/session/new/处访问资源会导致HTTP 404(未找到)错误。尝试在http://localhost:8080/enterprise/session/new处按预期方式访问相同的资源。

会话资源:

@GET
@Path("/new")
@Produces(MediaType.TEXT_HTML)
public Viewable newSession() {

    Map<String, Object> map = new HashMap<String, Object>();
    map.put("method","secEnterprise");

    // create authentication form
    return new Viewable("/session/new", map);

}

View位于WEB-INF \ views \ session \ new.jsp

我怀疑问题的一部分与web.xml的部分有关:

<filter>
    <filter-name>jersey</filter-name>
    <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.businessobjects.resources</param-value>
    </init-param>        
    <init-param>
        <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name>
        <!-- is this capturing the '/' and redirecting it to a non-existent view (.JSP)? -->
        <param-value>/((WEB-INF/views))/.*</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name>
        <param-value>/WEB-INF/views/</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.feature.Redirect</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.feature.FilterForwardOn404</param-name>
        <param-value>true</param-value>
    </init-param>        
</filter>

<filter-mapping>
    <filter-name>jersey</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我不确定这是否相关,但视图的形式是POST到/ session / session,而不仅仅是/ session:

<!-- new.jsp -->
...
<form method="post" action="session">
...

我错过了什么?

**编辑0 **

将表单元素的action属性更改为

<form method="post" action="/enterprise/session">

按预期工作。但是,结尾的斜杠:

<form method="post" action="/enterprise/session/">

导致前面提到的相同错误。

似乎需要更改正则表达式/((WEB-INF/views))/.*以忽略结束斜杠('/')。

**编辑1 **

我有一个根资源:

@Path("/")
public class HomeResource {

    @GET
    public Response index() {
        return Response.ok(new Viewable("/home/index")).build();
    }
}

http://localhost:8080/enterprise的请求会自动路由到http://localhost:8080/enterprise/,因此自动重定向的某些方面正常运行。

1 个答案:

答案 0 :(得分:1)

不确定您使用的是哪种实施方式,但引用了Jersey文档:

@Path值可能会也可能不会以'/'开头,它没有任何区别。同样,默认情况下,@ Path值可能会也可能不会以'/'结尾,它没有任何区别,因此请求以'/'结尾或不以'/'结尾的URL都将匹配。但是,Jersey有一个重定向机制,如果启用,它会自动执行重定向到以'/'结尾的请求URL,如果请求URL没有以'/'结尾并且匹配的@Path以'/'结尾。