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

时间:2016-03-28 11:47:35

标签: java mysql google-app-engine jdbc google-cloud-sql

基本上尝试通过Eclipse Java Web Project连接到我的Cloud SQL数据库

清单

  

1)将我的Google App Engine SDK更新为最新的1.9.34版本

     

2)将我的JDBC com.mysql.jdbc.Driver更新到最新的5.1.38版本

     

3)将JDBC驱动程序添加到构建路径

我无法连接到Google Cloud 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)

全天搜索并逐字浏览Stackoverflow上的每个相关问题。我准备拔头发了: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();
        }
    }

}

请修复此错误,谷歌团队!在此期间,有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

最后!固定它!对于那些面临这个问题的人。以下是解决问题的方法!

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

第2步:将您的Google App Engine SDK更新到最新版本。查看此链接中的最新SDK =&gt; https://cloud.google.com/appengine/downloads

第3步:将JDBC驱动程序更新为最新版本。查看此链接的最新信息=&gt; https://dev.mysql.com/downloads/connector/j/

第4步:以下是将JDBC jar正确添加到项目中的方法:将其复制并粘贴到lib文件夹(war / WEB-INF / lib)。右键单击Eclipse Project并单击Build Path - &gt;配置构建路径。点击“添加JAR”&#39;并转到您的lib文件夹并选择刚刚复制的mysql-connector-java文件。单击“应用”和“确定”。

第5步:清理并构建项目

第6步:我不知道这是否必要但是我们无论如何都要这样做。右键单击您的项目,然后转到“属性”。

第7步:展开“Google&#39;部分并选择App Engine。确保已启用(选中) Google Cloud SQL 并选择使用Google Cloud SQL实例单选按钮。

第8步:在该单选按钮的右侧,您会看到一个名为“配置”的链接。单击它并使用您的实例名称,数据库名称等填充字段,然后单击“确定”。

第9步:在我们之前看到的单选按钮下方,您应该看到名为“#strong> App Engine SQL实例&#”的标签旁边的另一个名为configure的链接39 ;.单击配置并使用实例名称,数据库名称等填充字段,就像我们之前所做的那样。单击“确定”并关闭“属性窗口”。

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

让我花太多时间来弄明白这一点,我知道我可以通过这个答案简化其他人的日子。祝你好运!

-Dinuka Jayasuriya,Future Googler;)