次の環境で正常に動作するWebアプリケーションがあります
- GWT 2.4.0
- RestEasy 2.3.2.Final JAX-RS&JAXB
- Hibernate JPA 2.0(hibernate-entitymanager + hibernate-validator)4.2.0。最終版
- ローカルホストでのMySQL5.5.22(Ubuntu 12.04)
- VMware2.6Tomcatサーバー
アプリケーションは、JAX-RS、JAXB、Jackson JSONプロバイダー、HibernateJPAアノテーションをすべて同じDTOに混合して使用して正常に動作しています。
私はそれをGAECloudSQLに移植しようとしています。MySQLアクセスエラーが発生しています。ORMをHibernateからEclipseLink2.3.2に変更する必要がありました。
リマインダー:
私は、HibernateベースのJPAをEclipseLinkに移植する方法という目前の問題を解決するのではなく、コードの間違いの可能性について仮説を立てないように回答者に敬意を表して要求します。私のセットアップまたはHibernateに適したコードで、GAECloudSQLを使用するには変更が必要であると思われる場合を除きます。理由は、アプリケーションがHibernateで正常に動作しているためです。
Hibernate JPA 2.0が関係していない限り、GAECloudSQLでHibernateを機能させる方法についての指示を提供しないでください。CloudSQLを使用してJPAを使用せずにHibernateを使用する方法の例がインターネット上にあることに気付きました。
DataNucleusJPA2.0をGAECloudSQLで動作させる方法に関する情報があれば非常に役立ちます。私はそれを動作させることができませんでした。それが私がEclipseLinkを使用している理由です。
また、MySQLデータソースのユーザーとパスワードは、Eclipseデータソースエクスプローラー、SQLエクスプローラー、またはSQLSquirrelクライアントのいずれかを介してデータベースにアクセスできます。したがって、ユーザー/パスワードに問題はありません。MqSQLユーザーまたはホストの設定を変更する必要があると思われる場合を除きます。
ホストlocalhost.localdomainを含めるために、mysql.dbテーブルに追加の行をすでに含めました。
「ローカルMySQLインスタンスの使用」の指示に従って、launch/debug設定を-Drdbms.url=jdbc:mysql:// localhost:3306 / Site?user = site&password = random&useInformationSchema = true&useUnicode = true&characterEncoding = UTF8&useServerPrepStmts=trueに変更しました。http://developers.google.com/cloud-sql/docs/developers_guide_javaの「開発中」。
解決のための提案には、1.0ではなくJPA2.0が含まれている必要があります。
CloudSQLアカウントにアクセスしていませんが、Ubuntu12.04で実行されているローカルホストMySQLデータベースにアクセスしています。このアプリケーションを使用してCloudSQLデータベースにアクセスしようとしたことはありません(まだ)。
たぶん、persistence.xmlにもっと行が必要ですか?私のEMF設定を変更する必要があるかもしれませんか?たぶん、GAEはHibernateとは異なるEMF取得シーケンスを必要としますか?おそらく、DataNucleusを無効にする必要がありますか?
助けてアドバイスしてください。どうもありがとうございます。
エラースタックは、java.security.AccessControlExceptionを示しています:アクセスが拒否されました( "java.net.SocketPermission" "localhost" "resolve"):
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>
appengine-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:
また、persistence.xmlでjdbcドライバーをcom.google.appengine.api.rdbms.AppEngineDriverに置き換えました。まだ同じアクセス制御例外が発生しています。