java - AppEngine React 和 Jersey - 您指定的 scrapDir 不可用

标签 java reactjs google-app-engine jersey

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

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

<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 过滤器:

<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 中指定了相关静态资源:

<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 应该启动并呈现登录页面。所有静态的,直到它检查 session 或其他东西。

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

然后,我把它放在appengine(标准环境)上,那就是另一回事了。 REST 端点均响应,但 React 应用程序未触发。我得到的只是: Error/login 或类似内容。

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

:WARN:oaj.EmbeddedServletOptions:RequestDA26342E: The scratchDir you specified: [/base/data/home/apps/g~myapp-alpha/alpha2.419176782209598562/jsp] is unusable

谷歌搜索一下,这个错误似乎与 WebContainer 中的目录权限有关,但这对我来说都是模糊的,因为这是 appengine。

这个错误的真正含义是什么? 问题是什么? 我该如何解决?

最佳答案

经过多次黑客攻击后,事实证明,在元素中指定 HTML 文件才是导致问题的原因。

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

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

那时一切都很幸福。

关于java - AppEngine React 和 Jersey - 您指定的 scrapDir 不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56774169/

相关文章:

java - 如何将 CSV 数据上传到数据存储

Java Swing 如何缩放三角形

java - 在 getter/setter 中指定方法

java - 是否可以检测内核生成 epoll 的时刻与 Sun JVM 读取它的时刻之间的时间差?

java - 为什么 Idea lint 警告缺少 `isPresent()` 检查 `orElseGet` ?

javascript - 如何使用 AsyncStorage 在 React Native 中保存登录凭据?

java - appengine spring aop java.security.AccessControlException : access denied ("java.lang.RuntimePermission" "accessClassInPackage.sun.reflect")

reactjs - 我可以在 React 应用程序中但在 React 组件之外安全地执行 DOM 操作吗?

node.js - 当我执行 heroku 推送时,为什么 Heroku 告诉我在我的模块中找不到 package.json

python - 当应用引擎上的任务队列为空时运行函数