我有一個是下面的環境下,做工精細的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中。仍遇到相同的訪問控制異常。
根據http://stackoverflow.com/questions/8335322/java-gwt-mysql-connection-refused GAE限制連接,它解釋了java.security.AccessControlException:訪問被拒絕(「java.net.SocketPermission」「localhost 「」解決「)連接到MSQL時。您將需要設置權限以允許連接到任何提供者的數據庫。 – Chris