Hi, Sir, thanks for providing the details.
but I can't fix the following deploy error when deploying my servlet to JBoss 5.1
1) Unable to create binding for com.google.inject.persist.PersistService. It was already configured on one or more child injectors or private modules
bound at com.google.inject.persist.jpa.JpaPersistModule.configurePersistence(JpaPersistModule.java:69)
If it was in a PrivateModule, did you forget to expose the binding?
while locating com.google.inject.persist.PersistService
for parameter 1 at com.google.inject.persist.PersistFilter.<init>(PersistFilter.java:71)
while locating com.google.inject.persist.PersistFilter
2) Unable to create binding for com.google.inject.persist.UnitOfWork. It was already configured on one or more child injectors or private modules
bound at com.google.inject.persist.jpa.JpaPersistModule.configurePersistence(JpaPersistModule.java:70)
If it was in a PrivateModule, did you forget to expose the binding?
while locating com.google.inject.persist.UnitOfWork
for parameter 0 at com.google.inject.persist.PersistFilter.<init>(PersistFilter.java:71)
while locating com.google.inject.persist.PersistFilter
Here is are my annotation class for my persistence unit. since I use multiple persistence units, I also defined a JpaUnitInstance class
@BindingAnnotation
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomerJpaUnit
{
}
class CustomerJpaUnitInstance<T extends Annotation> implements CustomerJpaUnit, Serializable
{
private static final long serialVersionUID = -1986769782077028259L;
private final Class<T> value;
private CustomerJpaUnitInstance(Class<T> annotation)
{
this.value = annotation;
}
public Class<T> value()
{
return this.value;
}
.....
}
here is my JPA module that extends PrivateModule:
public class CustomerDaoModule extends PrivateModule
{
@Override
protected void configure()
{
JpaPersistModule jpm = new JpaPersistModule("rvng-customer");
jpm.properties(new Properties()); // some kinda bug without this
install(jpm);
bindConstant().annotatedWith(CustomerJpaUnitInstance.of(CustomerJpaUnit.class)).to("rvng-customer");
bind(CustomerDao.class).annotatedWith(CustomerJpaUnit.class).to(CustomerDaoImpl.class);
expose(CustomerDao.class).annotatedWith(CustomerJpaUnit.class);
bind(CustomerDaoInitializer.class).annotatedWith(CustomerJpaUnit.class).to(CustomerDaoInitializer.class);
expose(CustomerDaoInitializer.class).annotatedWith(CustomerJpaUnit.class);
}
}
Similar, I have defined an annotation class and a private module with a different persistence unit. the pseudo code shown as below
public class RefereceDaoModule extends PrivateModule
{
@Override
protected void configure()
{
JpaPersistModule jpm = new JpaPersistModule("rvng-referece");
jpm.properties(new Properties()); // some kinda bug without this
install(jpm);
bindConstant().annotatedWith( RefereceJpaUnitInstance.of( RefereceJpaUnit.class)).to("rvng-customer");
bind( RefereceDao.class).annotatedWith( RefereceJpaUnit.class).to( RefereceDaoImpl.class);
expose( RefereceDao.class).annotatedWith( RefereceJpaUnit.class);
bind( RefereceDaoInitializer.class).annotatedWith( RefereceJpaUnit.class).to( RefereceDaoInitializer.class);
expose( RefereceDaoInitializer.class).annotatedWith( RefereceJpaUnit.class);
}
}
in my logic domain module, I invoke these two private modules:
public class CustomerDomainModule extends AbstractModule
{
@Override
protected void configure()
{
install(new ReferenceDaoModule());
install(new CustomerDaoModule())
......
}
}
In my test servlet, I inject the CustomerDomainModule, like
public class GuiceServletConfig extends GuiceServletContextListener
{
@Override
protected Injector getInjector()
{
return Guice.createInjector(new ServletModule( )
{
@Override
protected void configureServlets()
{
install(new CustomerDomainModule());
filter("/*").through(PersistFilter.class);
serve("/customerHandler").with(CustomerHandler.class);
}
});
}
}
Could you please advise what I did wrong? I really appreciate your help.
-Alice