问题标签 [jsr299]
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.
java - 具有子类运行时类型的触发事件
我想在 CDI 中触发一个事件,我只能在运行时确定其类型。例如,假设有一些A
实现类的接口AA
和AB
. 我有两个观察者:
然后是一些事件制作者:
这不起作用,因为A
既不是AA
or的子类型AB
(反之亦然)。我注意到有一种select
采用子类型的方法:
但是,它需要一个正确参数化的Class
对象,它(如果我错了,那就更正),我不能在运行时构建。
有什么解决方案还是我必须使用限定符(可能是带有Class<?>
方法的注释)?
java - 如何注入具有不同范围的同一类的对象?
就简单性和正确性而言,注入具有不同作用域的同一类的对象的最佳方法是什么?
在一个 servlet 中,我想注入具有不同范围的同一类的对象。还不知道要不要用jsf。
- 简单:
Qualifier
为每个作用域制作一个和一个生产者方法太多了;做一个接口,两个类,在里面添加替换beans.xml
也太多了;有Address#isCurrent()
方法没有意义。 - 正确性:JSR299, 3.11 说:不推荐使用 @Named 作为注入点限定符。 还是不知道为什么。
虽然@Named
在注入点使用适用于@ApplicationScoped
and@RequestScoped
但不适用于@SessionScoped
. 请参阅下面的命名片段。
在春天很容易:
春天片段
命名片段
cdi - 对于 CDI 注入,我是否需要生产者存档和被注入者存档中的 META-INF/beans.xml?
也许只是梳理CDI 1.0 规范的时间太长了,但我无法找到确切META-INF/beans.xml
需要 a 的位置的详细描述。
(关于 bean 发现的部分做了一些暗示某些事情的诱人陈述,但我不确定它是否是规定性的。)
我知道松散地说任何 bean 档案都需要一个。
但是考虑在兼容 CDI 1.0 环境中使用以下 jar 的情况:
- 仅包含接口的接口 jar
- 一个包含 CDI bean 的实现 jar,这些 CDI bean 实现了这些接口并具有
@Inject
注入点,但没有生产者方法 - 一个生产者 jar包含(为简单起见)带有单个方法的单个 Java 对象,该方法已用
@Produces
.
生产者 jar和实现 jar都需要是 bean 档案,这似乎是合乎逻辑的,因此每个都需要META-INF/beans.xml
包含在其中的资源。
但为了完整起见,事实是否如此?既然实现jar只用了一个@Inject
点,没有CDI注解,会不会被其他方式扫描呢?另一种看待它的方式:在此示例中,实现 jar仅用作注入的目标,而不是可注入的源。所以我可以看到某种逻辑会说:看,只有产生可以注入的 bean 的 jar需要被声明为 bean 档案。(我并不是说这是真的;只是我可以看到这个论点。)
最后,还有整个接口 jar的问题。根据定义,它不包含 bean,但我很久以前就看到过 GlassFish 的案例,即使接口 jar也必须在其中包含META-INF/beans.xml
文件。这对我来说似乎是错误的,但令我惊讶的是,我真的无法在规范中找到一个部分来确认或否认这一点。
所以:beans.xml
无处不在?只在可注射的罐子里?仅在注射目标罐中?或者...?
cdi - 如何强制使用 CDI 生产者方法?
我在这里的部分问题是使用正确的词汇,所以我提前为这可能是一个简单的术语问题道歉。
假设我有一个Person
接口和一个PersonBean
实现该接口的类。
进一步假设我在某处(带注释@Produces
)有一个生产者方法,它返回一个Person
. 在内部它返回一个 new PersonBean
,但这既不在这里也不在那里。
最后,假设我在某个地方有另一个 CDI bean,其注入点定义如下:
假设我有我的所有beans.xml
文件等,并且已经引导了 Weld 或另一个符合 CDI-1.0 的环境,因为这一切都代表我将得到一个模棱两可的定义错误。这是有道理的:Weld 会发现 myPersonBean
作为注入候选者(它可以只调用构造函数)并且会发现我的 producer 方法的输出作为注入候选者。
我想做的是以某种方式强制Person
此应用程序中实例的生成始终通过生产者方法。
我知道我可以在某处发明一些限定符,并使生产者方法产生Person
由该限定符限定的实例。如果我这样做,并将我的注入点更改为包含限定符,那么显然这些合格的注射剂只有一个来源(即我的生产者方法),所以瞧,问题解决了。
但是假设我不想发明一些虚假的限定词。(我不是说是这种情况;只是想更深入地理解这些问题。)我有什么选择?我有吗?我想我可以穿上它@Typed(Object.class)
,PersonBean
这样它就不会被 CDI 视为Person
...。
欢迎任何想法,包括指向文档的指针,或更好的理解方式。谢谢。
cdi - 如果我的对象是由生产者方法生成的,它的初始化方法会被自动调用吗?
我有一个生产者方法,可以创建实例——比如说——<code>Person。
此方法创建的实例是类型的PersonBean
,并且很明显实现了Person
.
这个类中有一个初始化方法:
bean 存档中的类路径上还有一个Something
实现,应该是此处注入的候选对象。
我观察到这个实现被注入到另一个非生产者方法产生的对象的适当注释字段中,所以我知道 Weld 正在找到它,它是有效的,等等。
规范不清楚(对我来说)我的生产者方法的返回值是否也会应用焊接/容器提供的依赖注入。
我当然注意到这个初始化方法不会自动调用。
归结起来,我的问题是:如果我正在生成一个对象,那么这是否意味着我的生产者方法必须处理该对象的所有初始化,或者(我所期望的)我的生产者方法只负责实例化?
netbeans - Errai、CDI、Netbeans 警告和 beans.xml
有什么简单的方法可以删除这些关于“不满意的依赖:没有 bean 与注入点匹配”的讨厌的 Netbeans 警告?问题是 GWT 和 Errai 包不包含 beans.xml 文件,因此不包含激活的 bean,因为它们不符合 bean 档案的条件。
有没有办法在外部“升级”这些包,即。不重建或修改它们?
Errai 在这方面似乎不符合 JSR-299。
提前致谢!
java - Weld @Inject ApplicationScope bean 在每个注入点创建新实例
我正在尝试使用 Weld 来理解 CDI。得到下一个结构:
其中 FooFacade 也是 @ApplicationScope。
当应用程序启动时,我得到一个 MainFacade 实例 = 1。当我将它注入其他类(GWT RPC servlet)并调用 mainFacade.getFooFacade() 时,将创建 MainFacade 的新实例以及 fooFacade 的新实例。
认为 Weld 会在我注入它的任何地方返回相同的应用程序范围 bean 实例。我做错了什么?
spring-mvc - 弹簧 MVC 和 CDI(焊接)
是否可以在 Web 应用程序中使用 Spring MVC 和 Weld?我还使用 WildFly 10.1 作为我的服务器和 RestEasy。