首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AppEngine React和Jersey -您指定的scratchDir不可用

AppEngine React和Jersey -您指定的scratchDir不可用
EN

Stack Overflow用户
提问于 2019-06-26 21:35:53
回答 1查看 135关注 0票数 0

我有一个基于Java的REST API (通过Jersey 1.18),我已经将它部署在一个AppEngine应用程序中,同时还有一个React前端。

我的web.xml声明了两个servlet:

代码语言:javascript
复制
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

...
    <servlet>
        <servlet-name>react</servlet-name>
        <jsp-file>/index.html</jsp-file>
    </servlet>
    <servlet-mapping>
        <servlet-name>react</servlet-name>
        <url-pattern>/login</url-pattern>
        ...
    </servlet-mapping>
...
    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    </servlet>
    <jsp-config>
        <taglib>
            <taglib-uri>http://www.myapp.com/customtags</taglib-uri>
            <taglib-location>/WEB-INF/custom-tags/UserRefTag.tld</taglib-location>
        </taglib>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <page-encoding>UTF-8</page-encoding>
        </jsp-property-group>
    </jsp-config>

当然,还有Jersey过滤器:

代码语言:javascript
复制
<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.myapp.servlets;com.myapp.tasks;com.wordnik.swagger.jersey.listing
        </param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.provider.packages</param-name>
        <param-value>com.myapp.audit;com.myapp.filters</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name>
        <param-value>/WEB-INF/jsp</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name>
        <param-value>/(js|css|(WEB-INF/jsp)|_ah|ipn|woff|woff2|ui|json|html)/.*</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.myapp.audit.AuditLogInterceptor</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
        <param-value>com.myapp.filters.CorsFilter</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>jersey</filter-name>
    <url-pattern>/tasks/*</url-pattern>
    ...
</filter-mapping>

我已经在appengine-web.xml中指定了相关的静态资源:

代码语言:javascript
复制
<static-files>
    <include path="/static/**" expiration="10s"/>
    <!-- react ui resources (eg: manifest.json etc) -->
    <include path="*.html" expiration="10s"/>
    <include path="*.json" expiration="10s"/>
    <include path="*.js" expiration="10s"/>
</static-files>

因此,理想情况下,当用户访问像/login这样的端点时,它应该转换为react servlet,并被定向到index.html,即react应用程序。然后,ReactRouter将启动并呈现登录页面。都是静态的,直到它检查会话或其他什么。

这一切在devserver中都运行得非常好。当我加载/login时,它会呈现我的react应用程序。当react应用程序调用后端REST端点时,它们都可以工作。

然后,我把它放在appengine (标准环境)上,情况就不同了。REST端点都会响应,但react应用程序不会触发。我得到的结果是:Error /login或类似的。

当我查看appengine日志时,我看到了以下内容:

代码语言:javascript
复制
:WARN:oaj.EmbeddedServletOptions:RequestDA26342E: The scratchDir you specified: [/base/data/home/apps/g~myapp-alpha/alpha2.419176782209598562/jsp] is unusable

谷歌一下,这个错误似乎与WebContainer中的目录权限有关,但这都是我搞不清的,因为这是appengine。

这个错误到底是什么意思?有什么问题吗?我怎么解决它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-26 22:50:41

经过多次修改后,事实证明,在元素中指定一个HTML文件是导致问题的原因。

无论appengine使用什么webcontainer都试图编译它,但appengine应该在上传时预编译所有JSP,这样它就不必这么做了。他们的设置显然无法应对这一点。

修复方法是将/index.html移动到/WEB-INF/jsp/index.jsp中并将其重命名

那时候一切都很幸福。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56774169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档