带有 Jersey 和 Spring 的 @Autowired 属性上的 NullPointerException 用于 REST 服务
我一直在开发一个 gwt 应用程序,它应该有一个 rest 服务来访问数据库,包括它自己的数据库和其他远程数据库.我使用 Spring 来更好地使用数据库 (objectdb),而不是在 Jersey 上进行练习.这是给出问题的代码:
I've been development a gwt application with should have a rest service to access the database, both its own database and the other remote ones. I use Spring to better work with database (objectdb) and not I was having practice with Jersey. Here's the code giving the problem:
用户.java
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@XmlRootElement
public class User implements java.io.Serializable {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
private String name;
private String surname;
private int age;
...
}
客户.java
@Entity
@XmlRootElement
public class Customer extends User implements java.io.Serializable{
private static final long serialVersionUID = 1L;
@Column(unique=true)
private String fiscalCode;
@Column(unique=true)
private String docNumber;
...
}
CustomerDAO.java
CustomerDAO.java
@Repository("customerDAO")
public class CustomerDAO extends JpaDAO<Customer> {
...
}
JpaDAO.java
JpaDAO.java
public abstract class JpaDAO<E> {
protected Class<E> entityClass;
@PersistenceContext(unitName = "MyPersistenceUnit")
protected EntityManager em;
@SuppressWarnings("unchecked")
public JpaDAO() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[0];
}
public List<E> findAll() {
TypedQuery<E> q = em.createQuery(
"SELECT h FROM " + entityClass.getName() + " h", entityClass);
return q.getResultList();
}
最后是 CustomerServiceImpl.java
and finally CustomerServiceImpl.java
@Service("customerService")
@Path("/customers")
public class CustomerServiceImpl implements CustomerService {
@Autowired
private CustomerDAO customerDAO;
@Override
@GET
@Produces({MediaType.APPLICATION_XML})
public List<Customer> findAll() {
return customerDAO.findAll();
}
}
web.xml 正确编写.当我表演时
the web.xml is correctly written. When I perform
http://127.0.0.1/rest/customers
看来 customerDAO 为 null 并导致该异常...
It seems that customerDAO is null and it causes that exception...
你能帮忙吗?
这里是 web.xml
here is web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
<!-- Servlets -->
<!-- Default page to serve -->
<welcome-file-list>
<welcome-file>RONF.html</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springGwtRemoteServiceServlet</servlet-name>
<servlet-class>org.spring4gwt.server.SpringGwtRemoteServiceServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springGwtRemoteServiceServlet</servlet-name>
<url-pattern>/ronf/ronfServices/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Jersey</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>it.unibo.ronf.server.services</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-spring</artifactId>
<version>${jersey.version}</version>
</dependency>
</web-app>
这里是 applicationContext.xml
and here is applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<context:component-scan base-package="it.unibo.ronf"/>
<context:annotation-config/>
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" pool-size="5"/>
<task:scheduler id="myScheduler" pool-size="10"/>
<tx:annotation-driven/>
<bean class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" id="entityManagerFactory">
<property name="persistenceUnitName" value="MyPersistenceUnit"/>
</bean>
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
</beans>
推荐答案
您还没有在 applicationContext.xml 文件中为 customerDAO
创建 bean.如果您想在 CustomerServiceImpl.java
中将其用作 bean,请在 applicationContext.xml 中创建它的 bean.
You have not created bean for customerDAO
in your applicationContext.xml file. If you want to use this as bean in your CustomerServiceImpl.java
, create its bean in applicationContext.xml.
将以下代码放入您的 applicationContext.xml 中:
Put below code in your applicationContext.xml :
<bean class="name.of.package.CustomerDAO" id="customerDAO">
</bean>
并在您的 CustomerServiceImpl.java
类上添加 @Component
注释.
And Add @Component
annotation on your CustomerServiceImpl.java
class.
这应该适合你.作为参考,您可以使用 this 教程.在这里可以更好的理解spring和JAX-RS的集成.
This should work for you. For reference you can use this tutorial. Here you can better understand integration of spring and JAX-RS.
相关文章