Google Java 中的 App Engine 崩溃并出现 'AccessControlException: access denied...' 异常

Google App Engine in Java crashes with 'AccessControlException: access denied...' Exception

基本上是尝试通过我的 Eclipse Java Web 项目

连接到我的云 SQL 数据库

清单

1) Updated my Google App Engine SDK to the latest 1.9.34 version

2) Updated my JDBC com.mysql.jdbc.Driver to the latest 5.1.38 version

3) Added the JDBC Driver to the build path

我根本无法连接到 Google 云 SQL 并因以下错误而崩溃:

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:372)
    at java.security.AccessController.checkPermission(AccessController.java:559)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:429)
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkAccess(DevAppServerFactory.java:454)
    at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
    at java.lang.Thread.init(Thread.java:391)
    at java.lang.Thread.init(Thread.java:349)
    at java.lang.Thread.<init>(Thread.java:445)
    at java.util.TimerThread.<init>(Timer.java:499)
    at java.util.Timer.<init>(Timer.java:101)
    at java.util.Timer.<init>(Timer.java:146)
    at com.mysql.jdbc.ConnectionImpl.<clinit>(ConnectionImpl.java:208)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:191)
    at com.google.appengine.tools.development.agent.runtime.RuntimeHelper.checkRestricted(RuntimeHelper.java:70)
    at com.google.appengine.tools.development.agent.runtime.Runtime.checkRestricted(Runtime.java:65)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:283)
    at java.sql.DriverManager.getConnection(DriverManager.java:571)
    at java.sql.DriverManager.getConnection(DriverManager.java:233)
    at com.dinuka.myapp.servlets.PlanServlet.doPost(PlanServlet.java:59)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

搜索了一整天,逐字逐句地浏览了 Whosebug 上的每个相关问题。我要拔头发了:D

这是我连接到我的数据库的非常简单的代码。不敢相信我做错了什么:

public class MyServlet extends HttpServlet {

    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {

        String url = null;
        try {
            if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
                // Load the class that provides the new "jdbc:google:mysql://" prefix.
                Class.forName("com.mysql.jdbc.GoogleDriver");
                url = "jdbc:google:mysql://app_id:instance_id/data?user=root";
            } else {
                // Local MySQL instance to use during development.
                Class.forName("com.mysql.jdbc.Driver");
                url = "jdbc:mysql://instance-ip:3306/data?user=root";
            }
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        PrintWriter out = resp.getWriter();
        try {
            Connection conn = DriverManager.getConnection(url);
            System.out.println("Connection established");
            out.println("Connection established");
            try {
            } finally {
                conn.close();
            }
        } catch (SQLException e) {
            out.append(e.getMessage());
            e.printStackTrace();
        }
    }

}

请修复此错误,Google 团队!与此同时,有人可以帮我解决这个问题吗?

终于!固定它!对于任何面临这个问题的人。修复方法如下!

第 1 步: 保持道德高尚并保持积极(相信我,我知道)

第 2 步: 将您的 Google App Engine SDK 更新到最新版本。从这里检查最新的 SDK link => https://cloud.google.com/appengine/downloads

第 3 步: 将您的 JDBC 驱动程序更新到最新版本。查看最新的 link => https://dev.mysql.com/downloads/connector/j/

第 4 步: 以下是将 JDBC jar 正确添加到项目的方法:将其复制并粘贴到您的 lib 文件夹 (war/WEB-INF/lib)。右键单击您的 Eclipse 项目,然后单击构建路径 -> 配置构建路径。单击 'Add JARs' 并转到您的 lib 文件夹和 select 您刚刚复制的 mysql-connector-java 文件。单击应用并确定。

第 5 步:清理并构建您的项目

第 6 步: 我不知道这是否有必要,但我们还是这样做吧。右键单击您的项目并转到“属性”。

第 7 步: 展开 'Google' 部分和 select App Engine。确保 Google Cloud SQL 已启用(选中)并且 select Use Google Cloud SQL实例单选按钮。

第 8 步: 在该单选按钮的右侧,您会看到名为 'Configure' 的 link。单击它并用您的实例名称、数据库名称等填写字段,然后单击确定。

第 9 步: 在我们之前看到的单选按钮下方,您应该会在名为“App Engine 的标签旁边看到另一个名为配置的 link SQL 实例'。单击配置并用实例名称、数据库名称等填写字段,就像我们之前所做的那样。单击确定并关闭属性 Window。

最后一步: 再次清理并构建您的项目,然后 运行 它。如果您正确地执行了所有步骤,您应该连接到强大的 Google Cloud。

我花了太多时间来解决这个问题,我知道我可以用这个答案简化别人的一天。祝你好运!

-Dinuka Jayasuriya,未来 Googler ;)