Search code examples
javaspringguiceguice-3

Spring bean to google guice conversion


Below snippet is taken from here. My question is how can I have this binding in Guice.

<bean id="searchProcessor" class="com.googlecode.genericdao.search.jpa.JPASearchProcessor">
            <constructor-arg ref="metadataUtil" />
    </bean>

    <bean id="metadataUtil" class="com.googlecode.genericdao.search.jpa.hibernate.HibernateMetadataUtil"
            factory-method="getInstanceForEntityManagerFactory">
            <constructor-arg ref="entityManagerFactory" />
    </bean>

I need to @Inject JPASearchProcessor (see below). I am completely new to Guice.

@Inject
public void setSearchProcessor(JPASearchProcessor searchProcessor) {
        super.setSearchProcessor(searchProcessor);
}

Solution

  • I was able to resolve this by myself

    A provider class HibernateMetadataUtilProvider is create to provide HibernateMetadataUtil

        package core.models.dao;
    
        import javax.persistence.EntityManagerFactory;
    
        import org.hibernate.ejb.HibernateEntityManagerFactory;
    
        import com.google.inject.Inject;
        import com.google.inject.Provider;
        import com.googlecode.genericdao.search.MetadataUtil;
        import com.googlecode.genericdao.search.jpa.hibernate.HibernateMetadataUtil;
    
        @SuppressWarnings("deprecation")
        public class HibernateMetadataUtilProvider
                implements Provider<MetadataUtil> {
    
            @Inject
            private EntityManagerFactory emf;
    
            @Override
            public MetadataUtil get() {
                return HibernateMetadataUtil.getInstanceForEntityManagerFactory((HibernateEntityManagerFactory) emf);
            }
         }
    

    Another class JPASearchProcessorProvider is created which will inject JPASearchProcessor

        package core.models.dao;
    
        import com.google.inject.Inject;
        import com.google.inject.Provider;
        import com.googlecode.genericdao.search.MetadataUtil;
        import com.googlecode.genericdao.search.jpa.JPASearchProcessor;
    
        public class JPASearchProcessorProvider implements Provider<JPASearchProcessor> {
    
            @Inject
            private MetadataUtil mdu;
    
            @Override
            public JPASearchProcessor get() {
                return new JPASearchProcessor(mdu);
            }
    
        }
    

    Then in our inject class we can simply bind these providers

        public class AppInjector extends AbstractModule {
    
    
            @Override
            protected void configure() {
    
    
                /*
                 * JPA Bindings
                 */
                bind(JPASearchProcessor.class).toProvider(JPASearchProcessorProvider.class);
                bind(MetadataUtil.class).toProvider(HibernateMetadataUtilProvider.class);
    
    
        }