2012-05-14 69 views
3

我有一個是下面的環境下,做工精細的web應用程序GAE CLOUDSQL與MySQL訪問被拒絕

  • GWT 2.4.0
  • RestEasy的2.3.2.Final JAX-RS & JAXB
  • 休眠JPA 2.0(休眠-的EntityManager +休眠驗證器)4.2.0.Final
  • 的MySQL 5.5.22在本地主機(Ubuntu的12.04)
  • 的VMware 2.6 Tomcat服務器

該應用程序正在成功使用JAX-RS,JAXB,Jackson JSON提供程序,Hibernate JPA註釋全部混合到同一個DTO中。

我想將它移植到GAE CloudSQL。我遇到MySQL訪問錯誤。我必須將ORM從Hibernate更改爲EclipseLink 2.3.2。

提醒

  • 謹請回答者不要假設在我的代碼,而不是解決手頭的問題錯誤的可能性 - 如何移植我的Hibernate基於JPA來的EclipseLink。除非您認爲我的設置或適用於Hibernate的代碼需要更改才能與GAE CloudSQL協同工作。原因是,該應用程序在Hibernate下運行良好。

  • 請不要提供關於如何使Hibernate與GAE CloudSQL協同工作的指導,除非它涉及到Hibernate JPA 2.0。我意識到互聯網上有一個關於如何將Hibernate與CloudSQL一起使用但沒有JPA的例子。

  • 如果您有關於如何使DataNucleus JPA 2.0與GAE CloudSQL協同工作的信息將非常有用。我無法使它工作,這就是我使用EclipseLink的原因。

  • 此外,MySQL數據源用戶和密碼可以通過Eclipse數據源瀏覽器或SQL Explorer或SQL Squirrel Client訪問數據庫。所以,用戶/密碼沒有問題。除非你相信我需要修改MqSQL用戶或主機設置。

  • 我已經在mysql.db表中添加了一行,包含主機localhost.localdomain。

  • 我已經修改了啓動/調試配置,以 -Drdbms.url =的jdbc:mysql的://本地主機:3306 /網站用戶=網站&密碼=隨機& useInformationSchema =真&了useUnicode =真&的characterEncoding = UTF8 & useServerPrepStmts = true,如http://developers.google.com/cloud-sql/docs/developers_guide_java中的「在開發期間使用本地MySQL實例」所述。

  • 您的解決方案建議必須涉及JPA 2.0而不是1.0。

  • 我沒有訪問我的CloudSQL帳戶,而是在Ubuntu 12.04上運行的localhost MySQL數據庫。我尚未嘗試使用此應用程序訪問我的CloudSQL數據庫(尚未)。

可能是,我需要更多的線在我的persistence.xml?可能是我的EMF設置需要修改?可能是,GAE需要與Hibernate不同的獲得EMF的順序?也許,我需要禁用DataNucleus?

請幫助和建議。非常感謝你。


錯誤堆棧表示java.security.AccessControlException:訪問被拒絕( 「java.net.SocketPermission」 「localhost」 的 「決心」):

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance_(Runtime.java:126) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance(Runtime.java:134) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.Util.getInstance(Util.java:386) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) 
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2411) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153) 
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) 
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance_(Runtime.java:126) 
    at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance(Runtime.java:134) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) 
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) 
    at java.sql.DriverManager.getConnection(DriverManager.java:579) 
    at java.sql.DriverManager.getConnection(DriverManager.java:190) 
    at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:98) 
    ... 55 more 
Caused by: java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost" "resolve") 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366) 
    at java.security.AccessController.checkPermission(AccessController.java:555) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:252) 
    at java.lang.SecurityManager.checkConnect(SecurityManager.java:1048) 
    at java.net.InetAddress.getAllByName0(InetAddress.java:1203) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1127) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1063) 
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:247) 
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294) 
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2332) 
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2369) 

的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    version="1.0"> 
    <persistence-unit name="Site" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <class>org.blessedgeek.site.jaxrs.dto.Node</class> 
    <properties> 
     <property name="javax.persistence.jdbc.user" value="site" /> 
     <property name="javax.persistence.jdbc.password" value="random" /> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/Site" /> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"></property> 
    </properties> 
    </persistence-unit> 
</persistence> 

Maven依賴

<properties> 
    <resteasy.version>2.3.2.Final</resteasy.version> 
</properties> 
<dependencies> 
    <dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.10</version> 
    <scope>test</scope> 
    </dependency> 
    <dependency> 
    <groupId>com.google.gwt</groupId> 
    <artifactId>gwt-user</artifactId> 
    <version>2.4.0</version> 
    </dependency> 
    <dependency> 
    <groupId>javax.validation</groupId> 
    <artifactId>validation-api</artifactId> 
    <version>1.0.0.GA</version> 
    </dependency> 

    <dependency> 
    <groupId>com.smartgwt</groupId> 
    <artifactId>smartgwt</artifactId> 
    <version>3.0</version> 
    </dependency> 
    <dependency> 
    <groupId>com.smartgwt</groupId> 
    <artifactId>smartgwt-skins</artifactId> 
    <version>3.0</version> 
    </dependency> 
    <dependency> 
    <groupId>com.googlecode.mvp4g</groupId> 
    <artifactId>mvp4g</artifactId> 
    <version>1.4.0</version> 
    </dependency> 

    <dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>5.1.18</version> 
    </dependency> 

    <dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jaxrs</artifactId> 
    <version>${resteasy.version}</version> 
    <type>jar</type> 
    </dependency> 
    <dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jaxb-provider</artifactId> 
    <version>${resteasy.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.resteasy</groupId> 
     <artifactId>resteasy-jackson-provider</artifactId> 
     <version>${resteasy.version}</version> 
    </dependency> 
</dependencies> 

應用服務引擎-web.xml中

<?xml version="1.0" encoding="utf-8"?> 
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> 
    <application></application> 
    <version>1</version> 

    <threadsafe>true</threadsafe> 

    <!-- Configure serving/caching of GWT files --> 
    <static-files> 
    <include path="**" /> 

    <include path="**.nocache.*" expiration="0s" /> 

    <include path="**.cache.*" expiration="365d" /> 
    <exclude path="**.gwt.rpc" /> 
    </static-files> 

    <system-properties> 
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/> 
    </system-properties> 

    <sessions-enabled>true</sessions-enabled> 
    <async-session-persistence enabled="true" /> 

</appengine-web-app> 

的web.xml

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>Blessed Geek Site</display-name> 
    <!-- Auto scan REST service --> 
    <context-param> 
    <param-name>resteasy.scan</param-name> 
    <param-value>true</param-value> 
    </context-param> 

    <!-- this need same with resteasy servlet url-pattern --> 
    <context-param> 
    <param-name>resteasy.servlet.mapping.prefix</param-name> 
    <param-value>/site</param-value> 
    </context-param> 

    <listener> 
    <listener-class> 
     org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap 
    </listener-class> 
    </listener> 

    <servlet> 
    <servlet-name>resteasy-servlet</servlet-name> 
    <description>JAX-RS Tools Generated - Do not modify</description> 
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>resteasy-servlet</servlet-name> 
    <url-pattern>/site/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

例DTO類

@Entity 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement (name="node") 
@XmlType(propOrder = { "id", "name", "description", "iconURL", "parentID", "active", "type"}) 
public class Node 
implements Serializable{ 

    public enum Type{ 
    VIEW, ROOTNode, FOLDER, LEAF 
    } 

    @XmlAttribute 
    @Id 
    @GeneratedValue 
    private Long id; 
    @XmlAttribute 
    private String name; 
    @XmlAttribute 
    private String description; 
    @XmlAttribute 
    private String iconURL; 
    @XmlAttribute 
    private long parentID; 
    @XmlAttribute 
    private boolean active; 
    @XmlAttribute 
    @Enumerated(EnumType.STRING) 
    private Type type; 

    public Node() { 
    super(); 
    } 

    public Node(String name, String description) { 
    super(); 
    this.name = name; 
    this.description = description; 
    } 

    public Long getId() { 
    return id; 
    } 

    public void setId(Long id) { 
    this.id = id; 
    } 

    public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
    this.name = name; 
    } 

    public String getDescription() { 
    return description; 
    } 

    public void setDescription(String description) { 
    this.description = description; 
    } 

    public String getIconURL() { 
    return iconURL; 
    } 

    public void setIconURL(String iconURL) { 
    this.iconURL = iconURL; 
    } 

    public long getParentID() { 
    return parentID; 
    } 

    public void setParentID(long parentID) { 
    this.parentID = parentID; 
    } 

    public boolean isActive() { 
    return active; 
    } 

    public void setActive(boolean active) { 
    this.active = active; 
    } 

    public Type getType() { 
    return type; 
    } 

    public void setType(Type type) { 
    this.type = type; 
    } 

} 

更新2012/05/16

我也替換jdbc驅動程序com.google.appengine.api.rdbms.AppEngineDriver在persistence.xml中。仍遇到相同的訪問控制異常。

+1

根據http://stackoverflow.com/questions/8335322/java-gwt-mysql-connection-refused GAE限制連接,它解釋了java.security.AccessControlException:訪問被拒絕(「java.net.SocketPermission」「localhost 「」解決「)連接到MSQL時。您將需要設置權限以允許連接到任何提供者的數據庫。 – Chris

回答

2

persistence.xml中,嘗試用:

javax.persistence.jdbc.url = jdbc:google:rdbms://localhost/Site 
javax.persistence.jdbc.driver = com.google.appengine.api.rdbms.AppEngineDriver 

而且也把罐子的MySQL(從http://dev.mysql.com/downloads/connector/j/下載)到

爲我工作的AppEngine的Java-SDK-1.6.x的/ lib目錄/ IMPL使用本地MySQL和JDO。