No Persistence provider for EntityManager named xx
I've searched a lot about this exception, and although posts with the similar title exists this is a different scenario.
I've two projects in my eclipse 1) One JPA project 2) One Web project which consumes the entities from the JPA project. Both are OSGi and Maven enabled. I'm using the latest SpringFramework (3.1.1) for creating RESTful webservices in the Web project.
The project layouts are as follows:
1) JPA Project
Code:
com.demo.persistence
|-src
|-com.demo.persistence
|-User
|-META-INF
|-MANIFEST.MF
|-persistence.xml
|-pom.xml
2) Web Project
com.demo.web
Code:
|-src
|-com.demo.web.controller
|-Controller.java
|-com.demo.web.dao
|-UserDAO.java
|-UserListDAO.java
|-com.demo.web.model
|-UserBean.java
|-com.demo.web.interfaces
|-UserDAOIntf.java
|-WebContent
|-META-INF
|-MANIFEST.MF
|-WEB-INF
|-classes
|-log4j.properties
|-rest-context.xml
|-rest-context-osgi.xml
|-rest-servlet.xml
|-web.xml
|-pom.xml
----------
com.demo.persistence.User.java
Code:
@Entity
@XmlRootElement(name="user")
@Table(name = "T_USER")
@NamedQuery(name = "AllUsers", query = "select u from User u")
public class User {
@Id
@GeneratedValue
@Column(nullable = false)
private long id;
@Basic
@Column(nullable = false)
private String userName;
public void setUserName(String param) {
this.userName = param;
}
public String getUserName() {
return userName;
}
}
----------
com.demo.web.dao.UserDAO
Code:
public class UserDAO implements UserDAOInterface {
@PersistenceContext
private EntityManager em;
public User getUser(Long id) {
try{
return em.find(User.class, id);
} finally {
if(em != null)
em.close();
}
}
public List<User> getAllUsers() {
try {
List<User> users = em.createNamedQuery("AllUsers", User.class).getResultList();
return users;
} finally {
if(em != null)
em.close();
}
}
@Transactional
public User addUser(User user) {
try {
em.persist(user);
em.flush();
return user;
} finally {
if(em != null)
em.close();
}
}
}
----------
com.demo.web.model
Code:
public class UserBean {
private UserDAO userDAO;
public void addUserDetails( String userName ) {
User user = new User();
user.setUserName(userName);
this.userDAO.addUser(user);
}
public List<User> getAllUsers() {
return this.userDAO.getAllUsers();
}
public User getUser(Long id) {
return this.userDAO.getUser(id);
}
public User addUser(User user) {
return this.userDAO.addUser(user);
}
}
----------
com.demo.web.controller.Controller
Code:
@Controller
public class Controller {
private Jaxb2Marshaller jaxb2Marshaller;
private UserBean userBean;
public Jaxb2Marshaller getJaxb2Mashaller() {
return jaxb2Marshaller;
}
public void setJaxb2Mashaller(Jaxb2Marshaller jaxb2Marshaller) {
this.jaxb2Marshaller = jaxb2Marshaller;
}
@RequestMapping(method=RequestMethod.GET, value="/rest/users", headers="Accept=application/xml, application/json")
public @ResponseBody UserListDAO getUserList() {
return new UserListDAO(userBean.getAllUsers());
}
@RequestMapping(method=RequestMethod.GET, value="rest/user/{id}", headers="Accept=application/xml, application/json")
public @ResponseBody User getUser(@PathVariable Long id) {
return userBean.getUser(id);
}
@RequestMapping(method=RequestMethod.POST, value="rest/user/add", headers="Accept=application/xml, application/json")
public @ResponseBody User addUser(@RequestBody String userString) {
Source source = new StreamSource(new StringReader(userString));
User user = (User) jaxb2Marshaller.unmarshal(source);
return userBean.addUser(user);
}
----------
web.xml
Code:
<?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"
id="WebApp_ID" version="2.5">
<display-name>com.demo.web</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>
/WEB-INF/classes/log4j.properties
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
<!-- The context params that read by ContextLoaderListener -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/rest-context.xml
</param-value>
</context-param>
<!-- This listener will load other application context file in addition to springweb-servlet.xml -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
</web-app>
----------
Continued in post #2