2013-04-12 42 views
0

目前我正在開發我的第一個Google App Engine應用程序。我使用Jersey(JAX-RS)和JSP 2.0與自定義標記的組合來將應用程序邏輯與佈局分開。Google App Engine + Jersey + JSP結果NOT_FOUND

我創建的應用程序在本地沙箱中運行得很好(使用Maven appengine:devserver開始),但是當我在Google上運行完全相同的代碼時,出現同一調用的「錯誤: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/viewsWEB-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

我最初的猜測是你的應用程序在你的dev和appengine環境中部署了不同的上下文路徑,因此,URL是不同的 – NilsH

+0

@NilsH這怎麼改變URL呢?該日誌顯示資源在那裏,並且資源中正確的方法被調用。還是它改變了其他途徑之一? – joost1024

+0

我認爲你在執行控制器後關於視圖解析的權利。你可以調整日誌級別以提供更多的輸出嗎?當它工作時,你使用了什麼字符串? – NilsH

回答

2

我終於破解了它......它確實與Viewable中的路徑有關。我把它改爲:

@Path("/hello") 
public class HelloResource { 

    @GET 
    @Produces(MediaType.TEXT_HTML) 
    public Response displayHello() { 
     return Response.ok(new Viewable("/views/hello")).build(); 
    } 

} 

而且我感動包含JSP來的WEB-INFviews文件夾,並從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> 

現在它就像一個魅力!