Tôi có một cuộc chiến tranh có chứa những điều sau đây:PersistenceContext EntityManager tiêm NullPointerException
META-INF/MANIFEST.MF
WEB-INF/classes/META-INF/persistence.xml
WEB-INF/classes/com/test/service/TestServlet.class
WEB-INF/classes/com/test/service/TestEntity.class
WEB-INF/classes/jndi.properties
WEB-INF/classes/postgresql-ds.xml
WEB-INF/jboss-web.xml
WEB-INF/web.xml
index.jsp
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence 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_1_0.xsd" version="1.0">
<persistence-unit name="test">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/TestDS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
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>Test Web Application</display-name>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
<resource-ref>
<res-ref-name>TestDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
</web-app>
lớp TestServlet của tôi là như sau :
package com.test.service;
import java.util.*;
import javax.persistence.*;
import javax.ws.rs.*;
@Path("/service")
public class TestService {
@PersistenceContext(unitName = "test")
private EntityManager em;
@GET
@Path("/get")
@Produces("application/json")
public List get() {
return em.createQuery("from TestEntity").getResultList();
}
}
Khi phương thức get() được gọi, tôi nhận được NullPointerException; EntityManager chưa được tiêm. Bất kỳ đề xuất nào về những gì tôi có thể bị thiếu hoặc cách tôi có thể chẩn đoán nó? Có rất ít trong nhật ký máy chủ.
Tôi chắc rằng tôi đã làm việc này mà không cần tệp jboss-web.xml hoặc mục nguồn dữ liệu trong tệp web.xml. Tôi cũng đã triển khai ds.xml vào thư mục triển khai một cách riêng biệt và chắc chắn đã được chọn - tôi có thể thấy nó trong giao diện điều khiển JMX.
Đã thử sử dụng JBoss 4.2.3 và bản dựng 6.0 có cùng kết quả.
Đoán có vấn đề với việc đăng XML trong phần mã ?! – rich
Bạn sẽ phải thoát khỏi < and > -> < và > – adrianboimvaser
Tôi chưa bao giờ thử nó trong thực tế, do đó, không ghim tôi vào nó, nhưng nó thực sự có thể chạy JPA trên một webapp được khai báo để chạy như Servlet 2.3 (J2EE 1.3) thay vì Servlet 2.5 (Java EE 5, khi JPA được giới thiệu lần đầu tiên)? – BalusC