尝试在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/,因此自动重定向的某些方面正常运行。
答案 0 :(得分:1)
不确定您使用的是哪种实施方式,但引用了Jersey文档:
@Path值可能会也可能不会以'/'开头,它没有任何区别。同样,默认情况下,@ Path值可能会也可能不会以'/'结尾,它没有任何区别,因此请求以'/'结尾或不以'/'结尾的URL都将匹配。但是,Jersey有一个重定向机制,如果启用,它会自动执行重定向到以'/'结尾的请求URL,如果请求URL没有以'/'结尾并且匹配的@Path以'/'结尾。