2012-10-25 11 views
7

kiedy próbowałem podłączyć Cloud SQL poprzez WZP następujący błąd jest generowany:GAE + JPA: java.lang.NoClassDefFoundError: Nie można zainicjować klasa EMF

2012-10-25 10:07:38.439 
Error for /jpatest 
java.lang.NoClassDefFoundError: Could not initialize class com.my.jpa.EMF 
    at com.my.jpa.ContactService.createContact(ContactService.java:20) 
    at com.my.jpa.JPATestServlet.doGet(JPATestServlet.java:14) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 

2012-10-25 10:07:38.440 
Uncaught exception from servlet 
java.lang.NoClassDefFoundError: Could not initialize class com.my.jpa.EMF 
    at com.my.jpa.ContactService.createContact(ContactService.java:20) 
    at com.my.jpa.JPATestServlet.doGet(JPATestServlet.java:14) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 

EMF Moja klasa jest

public final class EMF { 
    private static final EntityManagerFactory emfInstance = Persistence 
      .createEntityManagerFactory("JPATest"); 

    private EMF() { 
    } 

    public static EntityManagerFactory get() { 
     return emfInstance; 
    } 
} 

EMF część inicjalizacji jest

public class ContactService { 
     private static Logger logger = Logger.getLogger(ContactService.class 
       .getName()); 

     public void createContact(Contact c) { 
      logger.info("Entering createContact: [" + c.getFirstName() + "," 
        + c.getLastName() + "]"); 
      EntityManager mgr = EMF.get().createEntityManager(); 
      try { 
       mgr.getTransaction().begin(); 
       mgr.persist(c); 
       mgr.getTransaction().commit(); 
      } finally { 
       mgr.close(); 
      } 
      logger.info("Exiting createContact"); 
     } 
} 

My Servlet jest:

public class JPATestServlet extends HttpServlet { 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws IOException {   
     ContactService service = new ContactService(); 
     service.createContact(new Contact("Manu", "Mohan", "686019", "TVM")); 
     resp.setContentType("text/plain"); 
     resp.getWriter().println("Hello, world"); 
    } 
} 

web.xml jest

<?xml version="1.0" encoding="utf-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> 
    <servlet> 
     <servlet-name>JPATest</servlet-name> 
     <servlet-class>com.my.jpa.JPATestServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>JPATest</servlet-name> 
     <url-pattern>/jpatest</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 
</web-app> 

persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="JPATest"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>com.my.jpa.Contact</class> 
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="com.google.cloud.sql.Driver" /> 
      <property name="javax.persistence.jdbc.url" value="jdbc:google:rdbms://instance-name/stock" /> 
      <property name="javax.persistence.jdbc.user" value="" /> 
      <property name="javax.persistence.jdbc.password" value="" /> 
      <!-- EclipseLink should create the database schema automatically --> 
      <property name="eclipselink.ddl-generation" value="create-tables" /> 
      <property name="eclipselink.ddl-generation.output-mode" 
       value="database" /> 
     </properties> 
    </persistence-unit> 
</persistence 
+0

czy skonfigurowałeś 'EMF' w web.xml? czy mógłbyś opublikować konfigurację 'web.xml'? – CycDemo

+0

@CycDemo wygląd zmodyfikowanego qn .. –

+0

Jak na twoje wczorajsze pytanie, nie cytowałeś swojego persistence.xml, a komunikat taki jak "Brak dostępnego menedżera StoreManager dla klucza adresu URL magazynu danych" jdbc "" oznacza, że ​​nadal nie masz ustaw "dostawcę" trwałości w pliku persistence.xml. – DataNucleus

Odpowiedz

2

Czy trzeba używać final dla EntityManagerFactory w EMF. Spróbuj użyć Singleton Design Pattern dla . Klasa EntityManagerFactory jest wątkowo bezpieczna.

EMF.java

public final class EMF { 
    private EntityManagerFactory emfInstance; 

    private static EMF emf; 

    private EMF() { 
    } 

    public EntityManagerFactory get() { 
     if(emfInstance == null) { 
      emfInstance = Persistence.createEntityManagerFactory("JPATest"); 
     } 
     return emfInstance; 
    } 

    public static EMF getInstance() { 
     if(emf == null) { 
      emf = new EMF(); 
     } 
     return emf; 
    } 
} 

// usages 
EntityManagerFactory emf = Emf.getInstance().get(); 

Here lepszy sposób na wykorzystanie EntityManagerFactory w internetowej tej aplikacji.

+0

ten błąd został rozwiązany, a następnie pojawił się inny błąd .. jpatest javax.jdo.JDOFatalUserException: Brak dostępnego menedżera StoreManager dla klucza adresu URL magazynu danych "jdbc". Upewnij się, że masz wszystkie odpowiednie wtyczki w CLASSPATH (np. Datanucleus-rdbms ?, datanucleus-db4o?) I rozważ ustawienie właściwości trwałości "datanucleus.storeManagerType" na typ używanego sklepu np. Rdbms, db4o –