Guice instantiates it, in the GuiceContextListener you can see the 'new 
ServletModule()'

The ServletModule looks like this:
public class ServletModule extends com.google.inject.servlet.ServletModule {
    private static final String JERSEY_SCAN_PACKAGE = 
"eu.vranckaert.worktime.json.endpoint.impl";
    private static final String JERSEY_POJO_MAPPING_FEATURE = "true";

    @Override
    protected void configureServlets() {
        /*
 * The following line will scan our package for Jersey Resources
 */

        final Map<String, String> params = new HashMap<String, String>();
        params.put("com.sun.jersey.config.property.packages", 
JERSEY_SCAN_PACKAGE);
        params.put("com.sun.jersey.api.json.POJOMappingFeature", 
JERSEY_POJO_MAPPING_FEATURE);

        filter("/*").through(PersistFilter.class);
        serve("/rest/*").with(GuiceContainer.class, params);
    }
}

In here I have the PersistFilter also for the session-per-http-request as 
explained in the docs (at the 
bottom): https://code.google.com/p/google-guice/wiki/JPA

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
             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_1_0.xsd";>

    <persistence-unit name="myDB" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.connection.driver_class" 
value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.url" 
value="jdbc:mysql://localhost:3306/WorkTime"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value=""/>
            <property name="hibernate.dialect" 
value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.archive.autodetection" value="class"/>
            <property name="hibernate.id.new_generator_mappings" 
value="true"/>
        </properties>
    </persistence-unit>
</persistence>

Remark the the transaction type that is set to RESOURCE_LOCAL. I also tried 
removing the transaction type. According to the docs I understand that if I 
set the transaction type to RESOURCE_LOCAL that I would have a session per 
transaction...

Kr

Dirk

Op vrijdag 18 oktober 2013 11:27:40 UTC+2 schreef Thomas Broyer:
>
> Who's responsible for instantiating the TestEndpoint class? Is it really 
> instantiated by Guice or is Guice only injecting its members (in which case 
> AOP won't work) ?
>
> On Friday, October 18, 2013 11:06:53 AM UTC+2, Dirk Vranckaert wrote:
>>
>> I'm building a backend application for one of my Android applications.
>> My setup is Hibernate as ORM, MySQL as DB, Guice as DI and Guice-Persist 
>> for the link between ORM and DI.
>>
>> My webservice-endpoint class looks like this:
>>
>> @Path("test")
>> public class TestEndpoint {
>>     @Inject
>>     private UserDao userDao;
>>
>>     @GET
>>     @Path("persistUser")
>>     @Produces(MediaType.TEXT_PLAIN)
>>     @Transactional
>>     public String persistUser() {
>>         User user = new User();
>>         user.setEmail("[email protected]");
>>         user.setFirstName("FirstName");
>>         user.setLastName("LastName");
>>         user = userDao.persist(user);
>>         return "ok";
>>     }
>> }
>>
>> When I manually manage the transaction it works and my entity is 
>> persisted:
>>
>> @Path("test")
>> public class TestEndpoint {
>>     @Inject
>>     private UserDao userDao;
>>
>>     @Inject
>>     private Provider<EntityManager> em;
>>
>>     @GET
>>     @Path("persistUser")
>>     @Produces(MediaType.TEXT_PLAIN)
>>     public String persistUser() {
>>         
>> ((HibernateEntityManager)em.get()).getSession().getTransaction().begin();
>>
>>         User user = new User();
>>         user.setEmail("[email protected]");
>>         user.setFirstName("FirstName");
>>         user.setLastName("LastName");
>>         user = userDao.persist(user);
>>
>>         
>> ((HibernateEntityManager)em.get()).getSession().getTransaction().commit();
>>
>>         return "ok";
>>     }
>> }
>>
>> My UseDaoImpl that is injected via UserDao looks like this:
>>
>> public abstract class UserDaoImpl {
>>     @Inject
>>     private Provider<EntityManager> em;
>>
>>     public EntityManager getEntityManager() {
>>         return em.get();
>>     }
>>     public User persist(User instance) {
>>         getEntityManager().persist(instance);
>>         return instance;
>>     }
>>
>>     public User findById(String id) {
>>         return getEntityManager().find(User.class, id);
>>     }
>> }
>>
>> My GuiceContextListener looks like this:
>> public class GuiceContextListener extends GuiceServletContextListener {
>>     @Override
>>     protected Injector getInjector() {
>>         Injector injector = Guice.createInjector(
>>                 new DatabaseModule(),
>>                 new GuiceDaoModule(),
>>                 new GuiceServiceModule(),
>>                 new ServletModule()
>>         );
>>         return injector;
>>     }
>> }
>>
>> The DatabaseModule:
>> public class DatabaseModule extends AbstractModule {
>>     private static final String JPA_UNIT = "myDB";
>>
>>     @Override
>>     protected void configure() {
>>         install(new JpaPersistModule(JPA_UNIT));
>>     }
>> }
>>
>> The GuiceDaoModule:
>> public class GuiceDaoModule implements Module {
>>     @Override
>>     public void configure(Binder binder) {
>>         binder.bind(UserDao.class).to(UserDaoImpl.class);
>>     }
>> }
>>
>> And this is my web.xml configuration:
>> <?xml version="1.0" encoding="ISO-8859-1"?>
>> <web-app 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";
>>          version="2.5">
>>   <display-name>MyApp</display-name>
>>
>>     <listener>
>>         
>> <listener-class>eu.vranckaert.test.guice.GuiceContextListener</listener-class>
>>     </listener>
>>
>>     <!-- GUICE -->
>>     <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>
>> </web-app>
>>
>>
>> When I do findById(..) I can also retrieve my record, so my DB connection 
>> is working, I'm just not able to use the @Transactional annotation... 
>> So I found something about wrong scope of my EntityManager, but I have no 
>> clue how I can change the entity manager's scope...
>>
>> You guys have any idea what is wrong with my setup that the annotation 
>> does not work?
>>
>> Dirk
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-guice.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to