No implementation for javax.persistence.EntityManager was bound.

1,087 views
Skip to first unread message

transmeta01

unread,
Feb 10, 2011, 7:40:05 PM2/10/11
to google-guice
I am implementing an application with google-guice for the first
time...So I am a newbie. I have read the docs on persistence with
guice/JPA (current JPA implementation is Hibernate ).

But I keep getting:

com.google.inject.CreationException: Guice creation errors:
1) No implementation for javax.persistence.EntityManager was bound.
while locating javax.persistence.EntityManager for parameter 0 at
ca.ioniq.server.dao.UserDAO.<init>(UserDAO.java:27) while locating
ca.ioniq.server.dao.UserDAO for parameter 0 at
ca.ioniq.server.service.impl.UserServiceImpl.<init>(UserServiceImpl.java:
20) while locating ca.ioniq.server.service.UserService for
parameter 0 at
ca.ioniq.server.resource.UserResource.<init>(UserResource.java:24)
at
ca.ioniq.server.integration.ServiceModule.configure(ServiceModule.java:
22)

ServiceModule:

public class ServiceModule extends AbstractModule {
@Override
protected void configure() {

// bind services
bind(UserService.class).toProvider(UserServiceProvider.class);

//....

}
}

UserService:

package ca.ioniq.server.service;

import ca.ioniq.server.service.impl.UserServiceImpl;
import ca.ioniq.shared.entity.User;
import com.google.inject.ImplementedBy;

/**
* @author <a href="mailto:ric...@ioniq.ca">Richard Mutezintare</a>
*/
@ImplementedBy(UserServiceImpl.class)
public interface UserService {

/**
* Register a new user.
* @param user
* @return
*/
public User register(User user);

/**
* Change the password for a given user.
* @param user user to update
* @param newPassword the new password
* @return
*/
public User changePassword(User user, String newPassword);

public User login(User user);

public User update(User user);
}

UserServiceImpl:

/*
* @(#)UserServiceImpl.java 2011
*/
package ca.ioniq.server.service.impl;

import ca.ioniq.server.dao.UserDAO;
import ca.ioniq.server.service.UserService;
import ca.ioniq.shared.entity.User;

import com.google.inject.Inject;

/**
* @author: <a href="mailto:ric...@ioniq.ca">Richard Mutezintare</a>
*/
public class UserServiceImpl implements UserService {

private UserDAO userDao;

@Inject
public UserServiceImpl(UserDAO userDao) {
this.userDao = userDao;
}

public User register(User user) {
userDao.persist(user);
return user;
}

public User changePassword(User user, String newPassword) {
userDao.updatePassword(user, newPassword);
return user;
}

public User login(User user) {
return userDao.findByName(user.getUserName());
}

public User update(User user) {
return userDao.merge(user);
}

public User findUser(Long id) {
return userDao.findById(id);
}
}

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_2_0.xsd"
version="2.0">

<persistence-unit name="classic-persistence" transaction-
type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- transaction will be manually managed in dev/test mode -->
<!-- <jta-data-source>java:/DefaultDS</jta-data-source> -->

<!-- test environment -->
<properties>
<property name="hibernate.archive.autodetection"
value="class"/>
<property name="hibernate.dialect"
value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-
drop"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.connection.driver_class"
value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost/classic"/>
<property name="hibernate.connection.username"
value="**************"/>
<property name="hibernate.connection.password"
value="*******************"/>
<property name="hibernate.connection.autocommit"
value="true"/>
</properties>
</persistence-unit>

</persistence>


BootStrap:

package ca.ioniq.server.integration;

import ca.ioniq.server.filters.UserFilter;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Stage;
import com.google.inject.persist.PersistFilter;
import com.google.inject.persist.jpa.JpaPersistModule;
import com.google.inject.servlet.GuiceServletContextListener;
import com.google.inject.servlet.ServletModule;

/**
* This is the application entry point
* <p/>
* Date: 05/02/11
*
* @author: <a href="mailto:ric...@ioniq.ca">Richard Mutezintare</a>
*/
public class BootStrap extends GuiceServletContextListener {

@Override
protected Injector getInjector() {

// TODO initialize cache

// TODO implement interceptor for logging and auditing

return Guice.createInjector(Stage.DEVELOPMENT,
new ServletModule() {
@Override
protected void configureServlets() {
install(new JpaPersistModule("classic-
persistence"));
filter("/*").through(PersistFilter.class);
filter("*/user/
login").through(UserFilter.class);
}
},
new ServiceModule()
);
}
}


web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
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">

<display-name>Classic</display-name>

<!-- Register the Service module with the binding for the
resources -->
<context-param>
<param-name>resteasy.guice.modules</param-name>
<param-value>ca.ioniq.server.integration.ServiceModule</param-
value>
</context-param>

<!-- Register the application bootstrap listener -->
<listener>
<listener-class>ca.ioniq.server.integration.BootStrap</
listener-class>
</listener>

<!-- Register RESTeasy listener -->
<listener>
<listener-class>

org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener
</listener-class>
</listener>



<!--
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-
class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-->

<!-- Default page to serve -->
<welcome-file-list>
<welcome-file>classic.html</welcome-file>
</welcome-file-list>

</web-app>


pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://
www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">

<!-- POM file generated with GWT webAppCreator -->
<modelVersion>4.0.0</modelVersion>
<groupId>ca.ioniq</groupId>
<artifactId>classic</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Classic Application</name>

<properties>
<gwtVersion>2.1.0</gwtVersion>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
<webappDirectory>${project.build.directory}/$
{project.build.finalName}</webappDirectory>
<hibernate-core-version>3.5.0-Final</hibernate-core-version>
<hibernate-entitymanager-version>3.4.0.GA</hibernate-
entitymanager-version>
<hibernate-validator-version>4.0.2.GA</hibernate-validator-
version>
</properties>


<dependencies>
<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-servlet</artifactId>
<version>2.1.0</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>com.google.gwt</groupId>
<artifactId>gwt-user</artifactId>
<version>2.1.0</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0-rc2</version>
</dependency>

<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-servlet</artifactId>
<version>3.0-rc2</version>
</dependency>

<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-persist</artifactId>
<version>3.0-rc2</version>
</dependency>

<!--<dependency>
<groupId>com.wideplay.warp</groupId>
<artifactId>persist</artifactId>
<version>2.0</version>
</dependency>
-->

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate-core-version}</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate-entitymanager-version}</version>
</dependency>

<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.0.Final</version>
</dependency>

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate-validator-version}</version>
</dependency>


<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>

<!-- In memory database. To replace MySQL for test -->
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.7</version>
</dependency>

<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>1.1.GA</version>
</dependency>

<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>1.1.GA</version>
</dependency>

<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
<version>1.1.GA</version>
</dependency>

<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-cache-core</artifactId>
<version>1.1.GA</version>
</dependency>

<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-guice</artifactId>
<version>1.2.1.GA</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-dbunit</artifactId>
<version>3.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-orm</artifactId>
<version>3.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-dbmaintainer</artifactId>
<version>3.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-easymock</artifactId>
<version>3.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-test</artifactId>
<version>3.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-inject</artifactId>
<version>3.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.8.3</version>
</dependency>

</dependencies>

<build>
<!-- Generate compiled stuff in the folder used for developing
mode -->
<outputDirectory>${webappDirectory}/WEB-INF/classes</
outputDirectory>

<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>

<testResource>
<directory>${basedir}/src/test/java/</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</testResource>
</testResources>


<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>2.1.0-1</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test</goal>
<goal>i18n</goal>
<goal>generateAsync</goal>
</goals>
</execution>
</executions>
<!-- Plugin configuration. There are many available
options, see gwt-maven-plugin
documentation at codehaus.org -->
<configuration>
<runTarget>classic.html</runTarget>
<hostedWebapp>${webappDirectory}</hostedWebapp>

<i18nMessagesBundle>ca.ioniq.client.ClassicMessages</
i18nMessagesBundle>
</configuration>
</plugin>

<!-- Copy static web files before executing gwt:run -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>exploded</goal>
</goals>
</execution>
</executions>
<configuration>
<webappDirectory>${webappDirectory}</
webappDirectory>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>attach-javadocs</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<systemPropertyVariables>
<net.sourceforge.cobertura.datafile>
${webappDirectory}/target/cobertura/
cobertura.ser
</net.sourceforge.cobertura.datafile>
</systemPropertyVariables>
<!-- for JDK6 Support -->
<argLine>-
Dsun.lang.ClassLoader.allowArraySyntax=true</argLine>
</configuration>
</plugin>

<!--
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
</plugin>
-->

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.4</version>
<configuration>
<formats>
<format>html</format>
<format>xml</format>
</formats>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.0-beta-3</version>
<configuration>
<reportPlugins>
<plugin>
<groupId>org.apache.maven.plugins</
groupId>
<artifactId>maven-project-info-reports-
plugin</artifactId>
<version>2.2</version>
<configuration>
<dependencyDetailsEnabled>false</
dependencyDetailsEnabled>
<dependencyLocationsEnabled>false</
dependencyLocationsEnabled>
</configuration>
<reports>
<report>foo</report>
<report>toto</report>
</reports>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</
groupId>
<artifactId>maven-javadoc-plugin</
artifactId>
<version>2.7</version>
</plugin>
</reportPlugins>
</configuration>
</plugin>

</plugins>
</build>
</project>


What I am missing here!


Kind regards
Richard
Reply all
Reply to author
Forward
0 new messages