2012-10-25 48 views
7

Khi tôi đã cố gắng để kết nối đám mây SQL của tôi qua JPA lỗi sau đây được tạo:GAE + JPA: java.lang.NoClassDefFoundError: Không thể khởi tạo lớp 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 Lớp tôi là

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

    private EMF() { 
    } 

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

EMF initialising phần là

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 là:

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 là

<?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

bạn có định cấu hình tệp web 'EMF'in không? bạn có thể đăng cấu hình 'web.xml' không? – CycDemo

+0

@CycDemo tìm qn được sửa đổi .. –

+0

Theo câu hỏi của bạn ngày hôm qua, bạn chưa trích dẫn persistence.xml của mình và một thông báo như "Không có StoreManager có sẵn cho khóa URL kho dữ liệu" jdbc "" có nghĩa là bạn vẫn chưa đặt "nhà cung cấp" kiên trì trong persistence.xml. – DataNucleus

Trả lời

2

Bạn cần phải sử dụng final cho EntityManagerFactory trong EMF. Hãy thử sử dụng Singleton Design Pattern cho EMF. EntityManagerFactory lớp là an toàn chỉ.

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 tốt hơn cách sử dụng EntityManagerFactory trong Application web.

+0

lỗi này được giải quyết sau đó một lỗi khác xuất hiện..jpatest javax.jdo.JDOFatalUserException: Không có sẵn StoreManager được tìm thấy cho khóa URL kho dữ liệu "jdbc". Hãy đảm bảo bạn có tất cả các plugin có liên quan trong CLASSPATH (ví dụ: datanucleus-rdbms ?, datanucleus-db4o?) Và cân nhắc đặt thuộc tính persistan "datanucleus.storeManagerType" thành loại cửa hàng bạn đang sử dụng, ví dụ: rdbms, db4o –

Các vấn đề liên quan