问题标签 [guice-3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
139 浏览

guice - 为什么在 guice 中定义的过滤器不监听 /*?

我的 DI 框架是 Guice。我也使用网站砖。也许我对这两个 API 的简单程度很着迷。但是我想使用 guice 绑定一个过滤器来监听 /* 但是过滤器只监听 / ?这是为什么?

当我调用localhost:8080/过滤器时执行但当我调用localhost:8080/index过滤器时不执行!这是为什么?

0 投票
1 回答
2531 浏览

java - 谷歌吉斯。使用@Provides 注解的方法不会被调用

我是 Guice 依赖注入的新手,希望有人能解释我为什么我的代码不起作用。

这是扩展 AbstractModule 的类:

在另一个班级我有一个私人成员

我想在factory对象上调用方法,但它始终为空。另外我在方法上设置了一个断点getSomeFactory(),它永远不会被调用。

我究竟做错了什么?

0 投票
1 回答
43 浏览

guice - 用guice注入不同的不同实例

所以,我们每个供应商都有一个属性文件,其中供应商永远不会超过 50 个(我们现在大概是 20 个)。每个都有大约20个属性左右。

我们希望为 VendorStream(以及他的所有孩子)的每个实例注入特定供应商的全新属性集。每个人都使用 VendorStream 但具有不同的属性数组。

有没有一种干净的方法可以用 guice 做到这一点,或者我们是否必须为每个供应商提供一个模块,这是我们真的不想要的,因为我们不想要 20 个模块。

谢谢,院长

0 投票
1 回答
3613 浏览

java - Guice - 现场注入限制

假设我们有一个名为 的类Bean,它依赖于另一个名为 的类Service,使用字段注入我们无法更改这些类的代码。另一个类 ( App) 使用 aProvider来随时构造 Bean 的新实例,我们可以随意更改这些类中的代码。

由于在Provider'get()方法中,新实例是使用new运算符创建的,因此无法将 注入Service到 中Bean,因此该Bean实例将不完整(服务字段将为null)。

绕过该问题的一种方法是将InjectorProvider 注入并在新实例上调用injector.injectMembers()该方法。get()

下面是一个代码示例(我避免使用接口来缩短代码)。

另一种方法是将 Bean 更改为使用构造注入,但正如我所说,让我们假设我们不能这样做。

我知道大多数人声称Injector应该避免注入,因为它破坏了整个 DI 理念,因为注入器只能在应用程序的入口点使用,而不能在其他任何地方使用,但是由于 Guice 提供了在应用程序中使用 DI 的不同方法,例如Field Injection,可能会发生像我描述的那种情况。此外,我已经看到在几个项目中经常使用 Field Injection,因此这种情况经常出现。

那么,是否有一种“更清洁”的方法来避免注入Injector我描述的问题?

0 投票
2 回答
453 浏览

java - Guice 辅助注入被忽略?

我已经使用 AssistedInject 在 Google Guice 中安装了一个工厂,但出现以下错误(我正在使用 JUnit 运行单元测试):

即使我install(new Factory...);从模块中省略了该行,此错误也是相同的,这使我认为该行以某种方式被忽略了。

这是模块代码

这是工厂界面

这是FCAOPtimalClusterEstimator 的构造函数

这是BasicFCATreeFactory 的构造函数,首先要调用另一个工厂。请注意,此工厂不是使用 AssistedInject 创建的,因为它使用泛型。

0 投票
1 回答
178 浏览

guice - 在 CLI 应用程序的嵌套类上进行 Guice 注入

我正在编写一个命令行界面应用程序,它使用 MyBatis 和 Guice 完成的注入连接到 Oracle 数据库。

我的问题是注入嵌套类。我的班级结构看起来很像这样

现在我需要我的用户在应用程序中输入他们的登录名和密码(不能在配置文件中使用),因此 Main 初始化 MyInjector,从中获取注入器对象,并使用它来注入和初始化 Menu1。问题是,一旦我进入 Menu1,它需要转到 MenuA,而 MenuA 将需要注入服务,谁知道这最终会走多远。

现在,我的第一个想法是让 MyInjector 成为一个单例类,并在需要的地方不断地获取它的实例,并获取一开始由 Main 类创建的注入器字段,但我有点好奇是否有更好的方法。

有没有更Guicey的方法来做到这一点?

0 投票
1 回答
1574 浏览

jpa - TransactionRequiredException:没有交易正在进行 Jersey + Guice + JPA

按照本教程使用 Guice 3.0:https ://code.google.com/p/google-guice/wiki/JPA

GuiceModule 类:

JPAInitializer.class

控制器类:

和堆栈跟踪:

javax.persistence.TransactionRequiredException:在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1332) 的 org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1171) 没有事务正在进行com.drone.mission.controller.MissionController.newMission(MissionController.java:37) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect。 DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81 ) 在 org.glassfish.jersey。server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171) at org.glassfish.jersey.server.model .internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:195) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker .invoke(ResourceMethodInvoker.java:406) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:350) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:106)在 org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:259) 在 org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 在 org.glassfish.jersey.internal .Errors$1.call(Errors.java:267) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297)在 org.glassfish.jersey.internal.Errors.process(Errors.java:267) 在 org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:320) 在 org.glassfish.jersey.server.ServerRuntime .process(ServerRuntime.java:236) 在 org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028) 在 org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373) 在 org. glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:219) 在 org.apache.catalina.core.ApplicationFilterChain .internalDoFilter(ApplicationFilterChain.java:303) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core.StandardWrapperValve.invoke( StandardWrapperValve.java:220) 在 org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:122) 在 org.org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 的 apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java) org.apache.catalina.core.StandardHostValve.__invoke(StandardHostValve.java: 170) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 在 org.apache.catalina.valves.AccessLogValve.invoke 的 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java) (AccessLogValve.java:950) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 org.apache。 coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler。进程(AbstractProtocol.java:607)在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java .util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:744)

我究竟做错了什么?

谢谢

0 投票
2 回答
253 浏览

java - 是否可以优雅地提供来自 Guice 辅助注入工厂的不包含参数或等价物的实例?

好的,所以下面的代码失败了。但是,如果存在多个潜在的 View 实例,那么在您想要使用它们的地方注入大量 Provider 提供程序会感觉很笨拙。在我的情况下这可能是可行的,但是我可以想象在其他情况下这不是很好......所以我想我会在我脑海中浮现这个问题时提出这个问题。我还没有尝试过的一种解决方案是在方法中添加虚拟的@Assisted 参数并像 factory.getView1(null) 一样调用,尽管这也不是很好。

请注意,我可以看到为什么对于 guice 实现者来说这将是一个极端情况,因为 guice 必须知道不要调用构造函数(看起来如此),而是使用提供者(它在技术上是知道的)。不过,最好询问是否有解决方案,而不是假设没有解决方案。:-)

额外的上下文

Alan 在下面问“你能举一个例子说明使用这个(不调用注入器)的真实代码是什么样的吗?我不明白你为什么不把工厂和相关视图一起注入(或者定义一个带注释的为每种类型的演示者提供方法)”

所以我有一个演示者,它被可视化为有点浮动布局的卡片。该演示者具有特定的业务逻辑,可以使用一组服务对其自身进行配置。应用程序中有一个“新建”按钮,它为您提供卡片视图,引导您完成新流程(卡片上的配置)。构建卡片后,将有一个不同的视图来表示卡片......但它共享许多相同的业务逻辑......所以理想情况下,我想重用已经配置了模型的演示者......但现在附加构建的视图。使用内置视图重新创建持久卡。除非您正在关注该讨论,否则请不要阅读。

请注意,上面的代码充分地提炼了我遇到的问题。下面使事情复杂化,因为它提供了更完整的上下文。

0 投票
1 回答
4793 浏览

java - Override binding or child module in Guice

Im writing a component using Google Guice that lives next to a web application that does not use any dependency injection tool.

The Guice Module in the component has a few "fixed" bindings that will not change and a couple that are dynamic since they change in every request from the web application.

The easy (and bad) way that I solved this is that everytime that the web application asks the component to do something for the first time, the component builds the new Guice Module, creates the instance and returns it to the web app:

I think that this is a bad approach since building the Injector per request is expensive. What I would like to have is an injector already created that I can override at runtime. I found some stuff around:

1- Override the dynamic bindings (answer https://stackoverflow.com/a/531110/1587864). This still needs to create a new injector so I would have the same problem.

2- Implement some kind of Factory that is already binded in the Injector and has the ability to access the "dynamic" properties that come from the web application and are per request.

I'm not sure how to implement the second one, does this concept exist in Guice?

Thanks

0 投票
2 回答
119 浏览

java - Guice - 创建到 java.lang.class 的绑定

Guice 是否有任何巧妙的方法(如果有的话)以某种方式将类类型绑定到接口?我不是指类的实例,而是实际的 java.lang.class 类型本身。

即(显然不起作用,但告诉我要做什么):

我知道一开始这似乎不可能,但我不知道是否有任何技巧可以做到这一点。想到的一个是将类类型包装在一个实际的实例化对象或其他东西中,但这似乎是最后的手段。

任何想法将不胜感激。谢谢!