java - Google App Engine + Jersey + JSP 结果为 NOT_FOUND

标签 java google-app-engine jsp jersey jax-rs

目前我正在开发我的第一个 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怎么样?引用了?

最佳答案

我终于破解了...它确实与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>

现在它就像一个魅力!

关于java - Google App Engine + Jersey + JSP 结果为 NOT_FOUND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15980315/

相关文章:

java - Phonegap相机拍照

java - 自定义 ListPreference 中的选定项目未更改

google-app-engine - 是否有一个函数可以在我的应用程序中找到命名路由的当前处理程序

python - SSL错误 : Can't connect to HTTPS URL because the SSL module is not available on google app engine

java - 如何在eclipse项目中编译并运行单个jsp文件

java - Stackoverflow 类似于 Struts2 或 JSP 的 URL

java - 将 actionListener 添加到另一个类的 JButton

java - 如何设置 SWT ToolItem 的高度?

android - 如何从 AppEngine 服务器获取图像到 Android Activity

javascript - ajax 调用时引导模式按钮 onclick 不起作用