目前我正在开发我的第一个Google App Engine应用程序。我使用Jersey(JAX-RS)和JSP 2.0与自定义标签的组合来将布局与应用程序逻辑分开。
我创建的应用程序在本地沙箱中运行完全正常(使用Maven appengine:devserver启动),但是当我在Google运行完全相同的代码时,我得到同一个调用的“Error:NOT_FOUND”错误。 GAE的日志说:
2013-04-12 12:37:38.520 /rest/home 404 ...
2013-04-12 12:37:34.034
com.sun.jersey.api.core.PackagesResourceConfig init: Scanning for root resource and provider classes in the packages:
xxx.rest
2013-04-12 12:37:34.308
com.sun.jersey.api.core.ScanningResourceConfig logClasses: Root resource classes found:
class xxx.rest.HomeResource
2013-04-12 12:37:34.308
com.sun.jersey.api.core.ScanningResourceConfig init: No provider classes found.
2013-04-12 12:37:34.619
com.sun.jersey.server.impl.application.WebApplicationImpl _initiate: Initiating Jersey application, version 'Jersey: 1.17.1 02/28/2013 12:47 PM'
2013-04-12 12:37:38.422
xxx.rest.HomeResource <init>: HomeResource constructor
2013-04-12 12:37:38.427
xxx.rest.HomeResource displayHomepage: Display home
最后两行显示HomeResource在那里,并且它被调用。它看起来像这样:
@Path("/home")
public class HomeResource {
private Log log = LogFactory.getLog(HomeResource.class);
public HomeResource() {
log.info("HomeResource constructor");
}
@GET
@Produces(MediaType.TEXT_HTML)
public Response displayHomepage() {
log.info("Display home");
return Response.ok(new Viewable("/home")).build();
//return new Viewable("/home");
}
}
JSP文件位于WEB-INF/views
,WEB-INF/tags
中的自定义标记位于web.xml
:
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>xxx.rest</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.property.WebPageContentRegex</param-name>
<param-value>/(img|js|css|(WEB-INF/tags)|(WEB-INF/views))/.*</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
标记的位置在JSP中指定为:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
这应该是正确的,因为JSP编译没有问题。
你能指点我帮助我解决这个问题吗?非常感谢提前!
修改
它似乎与JSP模板的位置有关。当我用静态Viewable
替换String
时,所有工作都按预期工作。如何引用WEB-INF/views
中的JSP?
答案 0 :(得分:2)
我终于破解了它......它确实与Viewable
中的路径有关。我改成了:
@Path("/hello")
public class HelloResource {
@GET
@Produces(MediaType.TEXT_HTML)
public Response displayHello() {
return Response.ok(new Viewable("/views/hello")).build();
}
}
此外,我将包含JSP的views
文件夹移动到WEB-INF
的父级,并删除了web.xml
中的一些行:
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>xxx.rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
现在它就像一个魅力!