When Guice there's no explicit binding in your Guice config, and the
resource has no @Inject-annotated constructor, then jersey-guice will only
inject its members, so AOP won't work.
https://github.com/jersey/jersey-1.x/blob/master/jersey/contribs/jersey-guice/src/main/java/com/sun/jersey/guice/spi/container/GuiceComponentProviderFactory.java
Workaround: add a constructor and annotate it with @Inject, or add a
bind(TestEndpoint.class) to your Guice module.
On Friday, October 18, 2013 11:34:39 AM UTC+2, Dirk Vranckaert wrote:
>
> 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.