NullPointerException в атрибуте @Autowired с Джерси и Spring для службы REST

Я разрабатываю приложение gwt, которое должно иметь службу отдыха для доступа к базе данных, как к своей собственной базе данных, так и к другим удаленным. Я использую Spring для лучшей работы с базой данных (objectdb), а не с практикой с Джерси. Здесь код, задающий проблему:

User.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;
...
}

Customer.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

@Repository("customerDAO")
public class CustomerDAO extends JpaDAO<customer> {
...
}
</customer>

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();
}
</e></e></e></e></e>

и, наконец, 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();
 }
}
</customer>

web.xml правильно написан. Когда я выполняю

http://127.0.0.1/rest/customers

Кажется, что customerDAO имеет значение null и вызывает это исключение...

Вы можете помочь?

здесь находится 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

<!--?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 id="entityManagerFactory">
 </bean>
<bean id="transactionManager">
 </bean>
</tx:annotation-driven></task:scheduler></task:executor></task:annotation-driven></context:annotation-config></context:component-scan></beans>
1 ответ

Вы не создали bean для customerDAO в файле applicationContext.xml. Если вы хотите использовать это как bean в своем CustomerServiceImpl.java, создайте его bean в applicationContext.xml.

Поместите ниже код в свой applicationContext.xml:

И добавьте аннотацию @Component в свой CustomerServiceImpl.java класс.

Это должно сработать для вас. Для справки вы можете использовать этот учебник. Здесь вы можете лучше понять интеграцию spring и JAX-RS.

licensed under cc by-sa 3.0 with attribution.