我刚刚开始使用 Guice,所以我的理解可能是完全错误的。
我有一个接口Foo和一个实现FooImp
我在模块中使用了以下代码来注入它:
bind(Foo.class).annotatedWith("Foo").toInstance(foo); // foo is an instance of FooImp
Run Code Online (Sandbox Code Playgroud)
然后我猜现在在我的代码中,Foo名称注释为“Foo”的实例将被替换为foo?
@Named("Foo")
Foo fooInst; // fooInst will be foo at runtime?
Run Code Online (Sandbox Code Playgroud)
如果我是对的,我怎样才能实现这一目标:
public Foo doSomething() { // for some reason there must be no arguments
@Named("Foo")
Foo fooInst; // injecting here seems not allowed...?
fooInst.do();
}
Run Code Online (Sandbox Code Playgroud) 有没有办法在我有一个方面必须在其逻辑中使用一些复杂的实例化服务的情况下使用 Guice 和 AspectJ ?
例如:
@Aspect
public class SomeAspect {
private final ComplexServiceMangedByGuice complexServiceMangedByGuice;
@Inject
public SomeAspect(ComplexServiceMangedByGuice complexServiceMangedByGuice){
this.complexServiceMangedByGuice = complexServiceMangedByGuice;
}
@AfterThrowing(value = "execution(* *(..))", throwing = "e")
public void afterThrowingException(JoinPoint joinPoint, Throwable e){
complexServiceMangedByGuice.doSomething(e);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试像示例中那样(使用方面构造函数),我的方面将不会被调用。如果我尝试注入字段(没有定义方面构造函数),方面将被调用,但字段complexServiceMangedByGuice不会被设置。我发现的一个解决方案是在建议方法主体中获取实例,因此一个方面将如下所示:
@Aspect
public class SomeAspect {
private static ComplexServiceManagedByGuice complexServiceManagedByGuice;
@AfterThrowing(value = "execution(* *(..))", throwing = "e")
public void afterThrowingException(JoinPoint joinPoint, Throwable e){
if(complexServiceManagedByGuice == null){
Injector injector = Guice.createInjector(new ModuleWithComplexService());
complexServiceMangedByGuice = injector.getInstance(ComlexServiceManagedByGuice.class);
}
complexServiceMangedByGuice.doSomething(e);
}
}
Run Code Online (Sandbox Code Playgroud)
但这会带来一些不良的开销。
我想使用 DI google guice,它在 Java 中工作得很好,但在 scala 中不起作用。这是我的代码:
模块:
class ConfigModule extends AbstractModule{
override def configure(): Unit = {
}
@Provides
@Named("config")
def getConfig(): Config = {
new Config
}
}
Run Code Online (Sandbox Code Playgroud)
配置
class Config {
val config1: String = "Sample"
}
Run Code Online (Sandbox Code Playgroud)
服务
class Service(@Named("config") config:Config) {
def read(): Unit = {
println("Reading")
}
}
Run Code Online (Sandbox Code Playgroud)
主班
object SampleJob {
def main(args: Array[String]): Unit = {
val injector = Guice.createInjector(new ConfigModule)
val service = injector.getInstance(classOf[Service])
service.read()
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
1) Could not …Run Code Online (Sandbox Code Playgroud) 我在尝试@Singleton of Guice时遇到了一个问题:
import com.google.inject.Singleton;
@Singleton
public class ConfigManager {
private String data;
public void setData(String data) {
this.data = data;
}
public String getData(){
return this.data;
}
public static void main(String[] args){
ConfigManager config1 = Guice.createInjector().getInstance(ConfigManager.class);
ConfigManager config2 = Guice.createInjector().getInstance(ConfigManager.class);
config1.setData("data");
System.out.println(config2.getData());
}
}
Run Code Online (Sandbox Code Playgroud)
为什么这个简单的样本总是打印空?
我正在编写一个使用GWT,Hibernate和Google Guice(使用GIN)的相当简单的应用程序.我想要做的是使用外部管理器管理事务(比如 @Transactional在Spring中使用),而不是使用EntityManager#getTransaction.我试过用@Transactional,但它似乎对我不起作用.
我已经使用了EntityManager注入Providers,如下所示:
/* import stuff */
public class DbProvider implements Provider<EntityManager> {
public EntityManager get() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persdb");
return emf.createEntityManager();
}
}
Run Code Online (Sandbox Code Playgroud)
在手动管理事务时,它似乎正常工作.我希望自动管理事务,也可以使用DBUnit进行自动化测试.
有谁知道如何解决这个问题?
我正在尝试为我的DAO对象创建一个JUnit测试.JUnit直接从Netbeans运行.我对其中的几种技术都很陌生,因此我有一段时间可以追踪我的错误来自何处.我的代码和我看到的相应错误是:
2011年7月22日下午7:09:09 com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient INFO:找不到javadb客户端jar文件,默认情况下derby jdbc驱动程序不可用.FATAL [DatasourceConnectionProvider] - 无法找到数据源:Waylon org.omg.CORBA.COMM_FAILURE:FINE:IOP00410001:连接失败:socketType:IIOP_CLEAR_TEXT; hostname:localhost; port:3700 vmcid:OMG次代码:1完成:没有javax.naming.NamingException:在SerialContext中查找'Waylon'失败[myEnv = {java.naming.factory.initial = com.sun.enterprise.naming.impl.SerialInitContextFactory ,java.naming.factory.url.pkgs = com.sun.enterprise.naming,java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [root异常是javax.naming .NamingException:无法为SerialContext获取SerialContextProvider [myEnv = {java.naming.factory.initial = com.sun.enterprise.naming.impl.SerialInitContextFactory,java.naming.factory.url.pkgs = com.sun.enterprise.naming ,java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [根异常是org.omg.CORBA.COMM_FAILURE:FINE:IOP00410001:连接失败:socketType:IIOP_CLEAR_TEXT; hostname:localhost; 端口:3700 vmcid:OMG次要代码:1完成:否]]在sun.sref.enterEv. .reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)在com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)在java.lang.reflect.Constructor.newInstance(Constructor.java:513 )在com.sun.corba的com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248)的javax.naming.InitialContext.lookup(InitialContext.java:392)中. ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95)位于com.sun.corba.ee.spi.orbutil的org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52). org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(Connec)中的logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387)tionProviderFactory.java:124)在com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access $ 400(WrapperGenerator.java:107)在org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29)在com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator $ 2.invoke(WrapperGenerator.java:511)位于com.sun.corba.ee的org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62)位于org.hibernate.cfg的$ Proxy40.connectFailure(未知来源)的org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)中的.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99).位于org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)的com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.(SocketOrChannelConnectionImpl.java:257)中的Configuration.buildSessionFactory(Configuration.java:1292)at com.sun.corba.ee.impl.transport.SocketOrChannelConnectionImpl.(SocketOrChannelConnec tionImpl.java:270)at com.unernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)at com.sun.corba.ee.impl.transport.SocketOrChannelContactInfoImpl.createConnection(SocketOrChannelContactInfoImpl.java:129)at com.sun位于com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl的org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)上的.corba.ee.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:223) .request(CorbaClientDelegateImpl.java:228)位于org.omg.CORBA的com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.is_a(CorbaClientDelegateImpl.java:393)的javax.persistence.Persistence.createEntityManagerFactory(未知来源) .portable.ObjectImpl._is_a(ObjectImpl.java:112)位于com.google.inject.persist的org.omg.CosNaming.NamingContextHelper.narrow(NamingContextHelper.java:69)的javax.persistence.Persistence.createEntityManagerFactory(未知来源) .jpa.JpaPersistService.在com.sun.enterprise.naming.impl.SerialContext $ ProviderCacheKey.getNameService(SerialContext.java:1241)的com.sun.label.LabelDAOIJTest.setUpClass(LabelDAOIJTest.java:36)的com.sun开始(JpaPersistService.java:94) .enterprise.naming.impl.SerialContext.getRemoteProvider(SerialContext.java:411)在com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:347)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:504)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at com.sun.enterprise.naming.impl.SerialContext.lookup (SerialContext.java:455)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在javax.naming.InitialContext.lookup(InitialContext.java:392)在java.lang.reflect.Method.invoke(方法. java:597)org.juni上的org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:52)位于org.junit.internal.runners.model.ReflectiveCallable.run的org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124)中的t.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:44)(ReflectiveCallable)的.java:15)在在org.junit.runners.model.FrameworkMethod org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29)在org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62).在org.hibernate的org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)的org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)中调用了爆炸性的(FrameworkMethod.java:41) .cfg.Configuration.buildSessionFactory(Configuration.java:1292)在org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)在org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859 )org.junit.runners.ParentRunner.run(父 Runner.java:303)org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)位于org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence)的junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39) .java:126)org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:518)at org.apache.tools.ant的javax.persistence.Persistence.createEntityManagerFactory(未知来源) .taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1052)位于org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:906)的javax.persistence.Persistence.createEntityManagerFactory (未知来源)at com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:94)at waylon.label.LabelDAOIJTest.setUpClass(LabelDAOIJTest.java:36)引起:javax.naming.NamingException:Unable获取SerialContext的SerialContextProvider [myEnv = {java.naming.factory.initial = …
这是一些代码:
public class InjectedClass{
private final Dependency dependency;
private final String string;
@Inject
public InjectedClass(Dependency dependency, String string){
this.dependency=dependency;
this.string=string;
}
}
Run Code Online (Sandbox Code Playgroud)
假设我已经将我的依赖项绑定在我的模块中,但是我没有对String进行任何绑定.Guice如何/如何选择成为String参数的默认值?在我(更复杂的)测试用例中,似乎将其设置为"",但是它的逻辑如何对我来说并不明显,我不知道这是否是确定性行为.
按照Up和在MaE,Jersey和Guice的AppEngine上运行的优秀步骤- 第3部分,除了将对象注入Jersey POJO之外,我已经能够完成所有工作.
我从该配置中唯一的区别是我也集成了Objectify,但这是有效的.
TestClass注入到HelloWorldServlet工作中的实例(单例),但注入POJO 的TestClass和SecondTest(RequestScoped)对象HeyResource总是如此null.
我怀疑HK2和Guice之间的互动应该归咎于此,但这是我与Guice , Jersey 和 HK2的第一个项目,所以我都在海上.
我的配置是:
bind(Foo.class).to(Bar.class)与bind(Foo.class).toInstance(new Bar())之间的区别是什么?
另外,使用后一种调用构造函数new Bar()的方法可以正确地注入字段吗?
当我使用特定注释注释List时,我正在尝试绑定List的实例.
我尝试使用Instance Binding和Provider方法,但我一直收到错误.
这是我的@Provides方法和configure()
@Provides @Named("Regions")
public List<String> getRegions() {
return AppConfig.findVector("Regions"); //this would return a Vector<String>
}
@Override
protected void configure() {
bind(List.class).annotatedWith(Names.named("Regions")).to(Vector.class);
}
Run Code Online (Sandbox Code Playgroud)
以下是我尝试获取实例的方法 -
List<String> regions = injector.getInstance(Key.get(List.class, Names.named("Regions")));
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误
com.google.inject.ConfigurationException: Guice configuration errors:
1) No implementation for java.util.List annotated with @com.google.inject.name.Named(value=Regions) was bound.
while locating java.util.List annotated with @com.google.inject.name.Named(value=Regions)
Run Code Online (Sandbox Code Playgroud) guice ×10
java ×8
aop ×1
aspectj ×1
constructor ×1
derby ×1
hibernate ×1
jersey-2.0 ×1
jpa ×1
maven-3 ×1
scala ×1
singleton ×1
transactions ×1
unit-testing ×1