4

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:

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> {
...
}

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

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

the web.xml is correctly written. When I perform

http://127.0.0.1/rest/customers

It seems that customerDAO is null and it causes that exception...

can you help?

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>

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>
SagittariusA
  • 5,289
  • 15
  • 73
  • 127

1 Answers1

3

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.

Put below code in your applicationContext.xml :

<bean class="name.of.package.CustomerDAO" id="customerDAO">
</bean>

And Add @Component annotation on your CustomerServiceImpl.java class.

This should work for you. For reference you can use this tutorial. Here you can better understand integration of spring and JAX-RS.

Abhendra Singh
  • 1,959
  • 4
  • 26
  • 46