标签: cdi

如何在当前视图(范围)中找到 CDI bean?

Java EE 6、CDI 1.1.x、Seam 3 等环境中,我们需要查找当前视图的所有 CDI beans ( @ViewScoped)。到目前为止我所尝试的是使用:

@Named
@ViewScoped
public class ViewHelper
{
    @Inject
    private BeanManager beanManager;

    public doSomethingWithTheBeanInstances()
    {
        Set<Bean<?>> beans = this.getBeanManager().getBeans( 
            Object.class, new AnnotationLiteral<Any>(){}
        );

        // do something
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这会返回它管理的所有bean。

我只需要找到当前视图范围内的那些,并且 - 这将是理想的 - 只找到那些实现特定接口(在多个层次结构级别上继承)的接口。

有什么方法可以做到呢?

请注意,由于 CDI 没有视图范围,因此我们使用Seam 3来注释所有视图范围的 bean,例如:

@Named
@ViewScoped
public class ResultManagerColumnHandler extends BaseColumnHandler
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

上面是一个需要寻找的实例(它@ViewScoped是 Seam 3 的 CDI 替代品)。

如何做呢?

jsf cdi seam3 view-scope jakarta-ee

5
推荐指数
1
解决办法
2903
查看次数

测试中的 CDI 错误

我正在使用 Wildfly Swarm 2018.5.0 构建一个应用程序。

当我设置应用程序测试时,“Hello World”应用程序中的一切都工作正常,但是当我将其添加到具有所有依赖项的应用程序时,会出现很多错误,例如:Unsatisfied dependency for type LoggingFraction with qualifiers @Any

如何解决此错误并正确设置我的测试的最佳方法?这是野蝇群错误吗?有什么办法让它发挥作用吗?为了澄清起见,我已更新到 Thorntail 2.1.0.Final,并且我在jandex依赖性方面也有类似的问题。在“Hello World”中工作,但是当我添加一些依赖项时出现错误。现在我正在没有测试的情况下进行开发,我不喜欢这样做!:(

2018-08-27 10:20:48,696 WARN  [org.jboss.weld.Validator] (MSC service thread 1-2) WELD-001471: Interceptor method setupFactories defined on class org.wildfly.swarm.container.runtime.xmlconfig.StandaloneXMLParserProducer is not defined according to the specification. It should not throw java.lang.Exception, which is a checked exception.
    at org.wildfly.swarm.container.runtime.xmlconfig.StandaloneXMLParserProducer.setupFactories(StandaloneXMLParserProducer.java:0)
  StackTrace
2018-08-27 10:20:48,698 WARN  [org.jboss.weld.Validator] (MSC service thread 1-2) WELD-001471: Interceptor method postConstruct defined on class org.wildfly.swarm.container.runtime.wildfly.ShrinkWrapFileSystem is not defined according to the specification. …
Run Code Online (Sandbox Code Playgroud)

testing cdi jboss-arquillian wildfly-swarm thorntail

5
推荐指数
0
解决办法
661
查看次数

如何使用 CDI 注入第三方实例化的对象

我有一个由第三方代码实例化的类(它使用反射来创建对象。)我提供他们的接口的实现,他们创建对象。在我的实现中,我想使用 CDI 注入执行逻辑的服务。这样做的正确方法是什么?

public interface ThirdPartyInterface {
    public void DoSomething();
}

public class InjectedService {
    public void DoSomeLogic() { ... }
}

public class MyImplementation implements ThirdPartyInterface {
    @Inject InjectedService service;

    @Override
    public void DoSomething() {
        service.DoSomeLogic();
    }
}
Run Code Online (Sandbox Code Playgroud)

我原本以为这可以通过 CDI 的魔力来实现,但发现我的服务对象为空。

到目前为止我唯一想到的就是在构造函数中手动注入服务

 public MyImplementation() {
     CDI<Object> cdi = CDI.current();
     service = cdi.select(InjectedService.class).get();
 }
Run Code Online (Sandbox Code Playgroud)

这是获取实例的正确/唯一/最佳方式吗?我正在使用 Weld 来实现 CDI。

我还发现这可以在构造函数中工作:

    public MyImplementation() {
        CDI<Object> cdi = CDI.current();
        BeanManager bm = cdi.getBeanManager();
        AnnotatedType<MyImplementation> myType = bm.createAnnotatedType(MyImplementation.class);
        Set<Bean<?>> beans = bm.getBeans(MyImplementation.class);
        Bean<?> bean …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection cdi weld

5
推荐指数
1
解决办法
986
查看次数

CDI:静态记录器与注入?

免责声明:这个问题并不是“基于意见”。我正在寻找强大的优点和缺点。

在 CDI 应用程序中,更传统且更适合使用的是:静态记录器: private static final Logger LOGGER = LoggerFactory.getLogger...;

或者有特定的生产者注入它? @Inject private Logger logger;

前一个的优点是我们可以创建自己的 LoggerFactory 包装器(出于某些目的)并在所有地方使用它,而不必担心有人滥用了另一个工厂。但是这种方法还有其他缺点/优点吗?什么更“规范”?

java logging dependency-injection cdi jakarta-ee

5
推荐指数
1
解决办法
589
查看次数

无法在 CDI @RequestScoped 托管 Bean 中注入ExternalContext 或 RequestParam

在网上搜索时,我发现应该可以将一些方便的 JSF 对象 @Inject 到 CDI bean 中,这些对象应该由 JSF 生成并通过 javax.faces.annotation.* 中的限定符公开(如 @RequestMap 或 @SessionMap)。

但是,我无法将这些资源 @Inject 到 CDI Bean 中。即使注入ExternalContextFacesContext失败,如 JSF 2.3 规范中所述,也应该可以 @Inject 以及以下内容:

  • javax.faces.application.ResourceHandler
  • javax.faces.context.Flash

  • javax.servlet.http.HttpSession <-- 这个正在工作

@RequestScoped
public class SimpleRequestParamReportProvider implements ReportParamsProvider {
    @Inject // <-- FAILS
    ExternalContext externalContext;

    @Inject // <-- FAILS
    FacesContext facesContext;

    @Inject @RequestMap // <-- FAILS
    Map<String, Object> requestMap;

    @Inject // <-- WORKS
    HttpSession httpSession;
Run Code Online (Sandbox Code Playgroud)

应用程序启动时显示错误:

在注入点 [BackedAnnotatedField] @Inject report.SimpleRequestParamReportProvider.facesContext 处带有限定符 @Default 的 FacesContext 类型的依赖关系不满足

我正在使用JBoss …

jboss cdi weld jsf-2.3 java-ee-8

5
推荐指数
0
解决办法
1351
查看次数

QuarkusTest 访问 JUnit5 扩展中的 Bean

我有@QuarkusTest基础测试班。我想实现一个 JUnit 5 扩展(BeforeEachCallback、AfterEachCallback),它与 Quarkus 测试上下文的特定 bean 交互。我尝试过CDI.current(),但结果是:java.lang.IllegalStateException: Unable to locate CDIProvide

例如,在基于 Spring 的测试中,我通过访问 ApplicationContext

@Override
  public void beforeEach(final ExtensionContext extensionContext) {
    final ApplicationContext applicationContext = SpringExtension.getApplicationContext(extensionContext);
    MyBean myBean = applicationContext.getBean(MyBean.class);
}
Run Code Online (Sandbox Code Playgroud)

然后我可以使用它以编程方式从测试上下文中查询具体 bean。有没有与 Quarkus 测试类似的方法?我的意思是,我可以将@Injectbean 放入我的测试类中并在@BeforeEach方法中访问它,但我正在寻找一个更“可重用”的解决方案。

非常感谢。

cdi junit5 junit-jupiter quarkus

5
推荐指数
1
解决办法
769
查看次数

使用 javax.faces.bean.ViewScoped 注解的 bean 时如何失败

有没有办法检测@Named用创建的 CDI-Beans javax.faces.bean.ViewScoped?我多次遇到过这样的情况:IDE 更喜欢这个注释而不是javax.faces.view.ViewScoped.

javax.faces.bean.ViewScoped当找到带注释的 CDI-Bean时,有没有一种好方法可以中止应用程序启动?

jsf cdi

5
推荐指数
1
解决办法
81
查看次数

当CDI注入POJO应该有效吗?(GlassFish v3)

当我将EJB 3.1 bean注入由@Inject创建的POJO时,注入工作.当我自己构建POJO时,它不会(Glassfish v3).这是正确的行为吗?

我的类(在EJB模块中):

@Singleton
@LocalBean
@Startup
@Named
public class NewSingletonBean {

    @PostConstruct
    public void init(){
        System.out.println("NewSingletonBean INIT");
    }

}
Run Code Online (Sandbox Code Playgroud)

_

public class MyPOJO {
        @Inject NewSingletonBean newSingletonBean;

        public void sth(){
            System.out.println("EJB injected into POJO: " + (newSingletonBean != null));
        }
}
Run Code Online (Sandbox Code Playgroud)

不起作用:

@Singleton
@LocalBean
@Startup
@DependsOn(value="NewSingletonBean")
public class NewSingletonBean2 {

    @Inject NewSingletonBean newSingletonBean;

    @PostConstruct
    public void init(){
        System.out.println("NewSingletonBean2 INIT");
        System.out.println("EJB injected into EJB: " + (newSingletonBean != null));
        MyPOJO p = new MyPOJO();
        p.sth();
    }

} …
Run Code Online (Sandbox Code Playgroud)

java ejb glassfish cdi ejb-3.1

4
推荐指数
1
解决办法
5813
查看次数

使用Qualifier和InjectionPoint作为@HttpParam在CDI/WELD中实现@RequestParam

玻璃鱼错误

INFO: Initializing Mojarra 2.1.6 (SNAPSHOT 20111206) for context '/NNTPjsf'
INFO: WEB0671: Loading application [NNTPjsf] at [/NNTPjsf]
SEVERE: Exception while loading the app
INFO: only once...
INFO: NNTP.loadMessages...
SEVERE: Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [FacesContext] with qualifiers [@Default] at injection point [[field] @Inject net.bounceme.dur.nntp.HttpParamProducer.facesContext]
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [FacesContext] with qualifiers [@Default] at injection point [[field] @Inject net.bounceme.dur.nntp.HttpParamProducer.facesContext]
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:274)
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:243)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:106)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:126)
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:345)
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:330)
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366) …
Run Code Online (Sandbox Code Playgroud)

java jsf glassfish facelets cdi

4
推荐指数
1
解决办法
1925
查看次数

在运行时获取所有已初始化的@ Named-beans列表

我使用javax.inject.Namedjavax.enterprise.context.*Scopedorg.omnifaces.cdi.ViewScoped来定义我的观点豆的生活范围.

现在我想获得所有实例化bean的列表.首先,我认为这篇博客文章涵盖了这个问题,但它只列出了@ManagedBeans.

你知道如何列出它们吗?如果不修复JavaEE的实现甚至版本,这是否可行?

亲切的问候,六甲

PS:我已经找到了org.omnifaces.cdi.BeanStorage,但我不知道如何访问它的地图.

jsf cdi omnifaces

4
推荐指数
1
解决办法
408
查看次数