我最近开始使用Google Guice,通过我在网络上找到的教程和代码工作,但现在我被困住了。
我已经尝试创建了一个genericDAO
,我可以在每个实体DAO的基础上扩展该genericDAO
。我很难弄清楚如何配置一个现有的私有Guice模块。
这里是我的PrivateModule
,其中Person
是一个使用String
作为标识的实体。address
类是另一个不依赖于genericdao
的实体(目前,我正在尝试让它一开始就简单)。
public class PersistModule extends PrivateModule {
@Override
protected void configure() {
install(new JpaPersistModule("jpa"));
bind(PersistenceLifeCycleManager.class)
.annotatedWith(PersistService.class)
.to(PersistenceLifeCycleManagerImpl.class);
expose(PersistenceLifeCycleManager.class)
.annotatedWith(PersistService.class);
bind(new TypeLiteral<GenericDAO<Person, String>>() {})
.to(new TypeLiteral<PersonDao>() {});
// How to expose this??
bind(AddressDao.class).asEagerSingleton();
expose(AddressDao.class);
bind(EntityLocator.class).asEagerSingleton();
expose(EntityLocator.class);
}
}
当尝试运行以下内容时,我会得到ConfigurationException
:
com.google.inject.ConfigurationException: Guice configuration errors:
1) Unable to create binding for com.guicetest.server.dao.PersonDao. It was already configured on one or more child injectors or private modules
(bound by a just-in-time binding)
If it was in a PrivateModule, did you forget to expose the binding?
while locating com.guicetest.server.dao.PersonDao
1 error
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
at com.guicetest.server.service.PersonService.getAllPersons(PersonService.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.web.bindery.requestfactory.server.ReflectiveServiceLayer.invoke(ReflectiveServiceLayer.java:182)
at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.invoke(ServiceLayerDecorator.java:111)
at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.invoke(ServiceLayerDecorator.java:111)
at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.invoke(ServiceLayerDecorator.java:111)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.processInvocationMessages(SimpleRequestProcessor.java:463)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:233)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:135)
at com.google.web.bindery.requestfactory.server.RequestFactoryServlet.doPost(RequestFactoryServlet.java:133)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:263)
at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:178)
at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62)
at com.guicetest.server.injector.PersistFilter.doFilter(PersistFilter.java:39)
at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Google Guice用户指南在这里没有真正帮助我,但我刚刚开始,所以也许我错过了什么,这真的很容易。
--编辑--
MyGuiceServletContextListner.java
public class MyGuiceServletContextListner extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new MyServletModule(),
new PersistModule());
}
}
MyServletModule.java
public class MyServletModule extends ServletModule {
@Override
protected void configureServlets() {
filter("/*").through(PersistFilter.class);
bind(ExceptionHandler.class).to(RequestFactoryExceptionHandler.class);
bind(ServiceLayerDecorator.class).to(MyServiceLayerDecorator.class);
Map<String, String> params = new HashMap<String, String>();
params.put("symbolMapsDirectory", "WEB-INF/classes/symbolMaps/");
serve("/gwtRequest").with(MyRequestFactoryServlet.class, params);
}
}
GenericDAOImpl.java
public abstract class GenericDAOImpl<E extends AbstractEntity, P> implements GenericDAO<E, P> {
@Inject
@PersistService
private PersistenceLifeCycleManager manager;
@Inject
private Provider<EntityManager> em;
private Class<E> entityClass;
@SuppressWarnings("unchecked")
@Transactional
@Override
public P create(E entity) { ... }
// etc ...
@Transactional
@Override
public List<E> getAll() {
List<E> list = null;
TypedQuery<E> qry = (TypedQuery<E>) getEntityManager()
.createNamedQuery(getEntityClass().getSimpleName()+".getAll", , getEntityClass());
if (qry != null) {
list = qry.getResultList();
}
return list;
}
@SuppressWarnings("unchecked")
@Override
public Class<E> getEntityClass() {
if (entityClass == null) {
Type type = getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
ParameterizedType paramType = (ParameterizedType) type;
entityClass = (Class<E>) paramType.getActualTypeArguments()[0];
} else {
throw new IllegalArgumentException("Could not guess entity class by reflection");
}
}
return entityClass;
}
}
persondao.java
public class PersonDao extends GenericDAOImpl<Person, String> {
@Transactional
public Person getPersonByEmailId(String emailId) { ... }
}
PersonService.java
public class PersonService {
@Inject
private Injector injector;
// ...
public List<Person> getAllPersons() {
PersonDao pd = injector.getInstance(PersonDao.class);
return pd.getAll();
}
您可以在专用模块中公开TypeLiteral
:
TypeLiteral<GenericDAO<Person, String>> personDaoTypeLiteral = new TypeLiteral<GenericDAO<Person, String>>() {};
bind(personDaoTypeLiteral).to(PersonDao.class);
expose(personDaoTypeLiteral);
那么在您的PersonService
中,您无法获得PersonDAO的实例,因为模块公开了GenericDAO
。
public class PersonService {
@Inject
private Injector injector;
public List<Person> getAllPersons() {
TypeLiteral<GenericDAO<Person, String>> personDaoTypeLiteral = new TypeLiteral<GenericDAO<Person, String>>() {};
PersonDao pd = injector.getInstance(Key.get(personDaoTypeLiteral));
return pd.getAll();
}
}
请注意,代码不清楚这些类型的文字。您可以使用常量:
public class Literals {
public static final TypeLiteral<GenericDAO<Person, String>> PERSON_DAO = new TypeLiteral<GenericDAO<Person, String>>() {
};
}
后来呢
bind(Literals.PERSON_DAO).to(PersonDao.class);
expose(Literals.PERSON_DAO);
而且
injector.getInstance(Key.get(Literals.PERSON_DAO));
我在guice中有一个PrivateModule,我想公开该模块的映射 映射得提供程序 我得到以下错误。 曝光这张地图的正确方法是什么?
可以自动绑定泛型类吗?考虑一下: 通用接口: 长子类型: 字符串子类型: 自定义模块:公共类CustomModule扩展AbstractModule{ } 主要的 是否可以以某种方式(例如:基抽象类、反射或其他)自动绑定
我正在使用Google Guice编写一个组件,它位于一个不使用任何依赖注入工具的web应用程序旁边。 组件中的Guice模块有几个不会改变的“固定”绑定和几个动态绑定,因为它们在web应用程序的每个请求中都会改变。 我解决这个问题的最简单(也是最糟糕)的方法是,每当web应用程序第一次要求组件做某事时,组件就会构建新的Guice模块,创建实例并将其返回给web应用程序: 我认为这是一种糟糕的方法
我正在开发一个基于JAX-RS的Java应用程序,使用Google Guice进行依赖注入。我的代码中有以下接口: 在上面的接口中,Lock是一个定义如下的接口: 锁接口由以下类实现: LockProvider接口由以下类实现: 除了LockProvider之外,我不希望应用程序中的类知道底层锁项,这就是为什么我没有在lock接口中包含getUnderlyingLockItem。 现在,当我尝试将
问题内容: 我花了一些时间想知道是否有可能编写一个guice模块,该模块本身使用类型T进行参数化,并使用其type参数指定绑定。 像在此示例(不起作用)中那样: 我尝试了不同的方法,试图将T作为类/ TypeLiteral的实例传递给MyModule,但没有一个起作用。帮助表示赞赏。 问候,zukasz Osipiuk 问题答案: 为此,您将必须使用从头开始构建每个TypeLiteral 。您可以
我正在尝试用Guice注入泛型类型。我有存储库 所以当我创建光标时