标签: cdi

CDI具有非托管对象

假设我有两个类,首先是一个没有任何属性,字段或注释的类:

public class B {}
Run Code Online (Sandbox Code Playgroud)

和一个注入B的类,如下所示:

public class A {
    @Inject
    private B b;

    public B getB() {
        return b;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在A级在我们使用之前是没用的,所以有两种选择:

  • @Inject它
  • 使用可靠的"新A()"手动构造它

如果A被注入,CDI管理它并且足够注入B,其具有隐含的@Dependent范围.很酷,就是我想要的.

但是,如果我手动构造A(假设在工厂或构建器中),CDI完全忽略我的对象并且不会注入类型B的对象.

示例我在谈论它什么时候不起作用,这里对象a将始终保持为null:

public class Builder {
    @Inject
    private A a;

    public static Builder ofTypeSomething() {
        // do some magic here
        return new Builder();
    }

    private Builder() {
        // and some more here
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

A类是一个有效的托管bean,并且有一个有效的范围,就像B类一样.即使我将@Producer添加到静态方法,它也不会改变任何东西(这很好,因为静态方法的想法是调用它,不要在任何地方注入Builder).

java java-ee cdi

7
推荐指数
1
解决办法
5355
查看次数

使用CDI注入命名字符串

我希望以这种方式注入配置参数:

public class MyManagedBean {
    @Inject
    public MyManagedBean(@Named("user") String user){
        ....

    }
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试用这种方式实现一个生成器方法:

@ApplicationScoped
public class MyConfiguration {
    private Properties loadProperties() {
        Properties properties = new Properties();
        try {
            properties.load(getClass().getResourceAsStream(
                    "user.properties"));
        } catch (IOException e) {
            throw new RuntimeException();
        }
        return properties;
    }

    @Produces
    @Named("user")
    String getUser() {
        return loadProperties().getProperty("user");
    }
}
Run Code Online (Sandbox Code Playgroud)

我有这样定义的其他bean:

public class OtherManagedBean {
    @Inject
    public OtherManagedBean(MyManagedBean myManagedBean){
        ....

    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试部署它时,我遇到了这个异常:

INFO: WEB0671: Loading application [example-ear#example-war.war] at [example]
SEVERE: Exception while loading the app
SEVERE: …
Run Code Online (Sandbox Code Playgroud)

java string dependency-injection named cdi

7
推荐指数
1
解决办法
3330
查看次数

Java EE7的拦截器问题

我正在测试/切换到Java EE7(Glassfish 4),我遇到的一个问题是拦截器,每当我尝试运行项目时,我都会收到以下错误.

严重:加载应用程序时出现异常:CDI部署失败:WELD-001417文件中启用拦截器类com.xxxxxx.security.SecuredInterceptor:/home/xxxxxx/xxxxxx/target/xxxxxx/WEB-INF/beans.xml@7既不是注释@Interceptor也没有通过便携式扩展注册

我正在看CDI 1.1规范的1.3.6节,它看起来没什么变化,所以我做错了什么?

这是我正在使用的代码;

@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Secured {}
Run Code Online (Sandbox Code Playgroud)

 

@Secured
@Interceptor
public class SecuredInterceptor implements Serializable
{
    @AroundInvoke
    public Object interceptSecured(InvocationContext ic) throws Exception
    {
        // Do Stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="annotated">
    <interceptors>
        <class>com.xxxxxx.security.SecuredInterceptor</class>
    </interceptors>
</beans>
Run Code Online (Sandbox Code Playgroud)

glassfish interceptor cdi java-ee-7

7
推荐指数
2
解决办法
2697
查看次数

Viewscoped JSF和CDI bean

我在JBoss EAP 6上使用Java EE 6,我的JSF bean注释如下:( @ManagedBean @ViewScoped两者都来自javax.faces.bean包)

然而,他们也CDI豆(默认构造函数,使用@Inject,@PreDestroy等等).我一直在阅读你不能混合这些注释(JSF和CDI),但它显然工作正常:注入正在工作,preDestroy在视图更改时被调用等).

我错过了什么吗?问题是什么?为什么不用?

jsf cdi view-scope

7
推荐指数
1
解决办法
4173
查看次数

如果要注入的实例具有最终类,如何使用InjectMocks

我想用mockito测试一些服务.这些服务基于CDI,不幸的是,使用现场注入,我无法改变.

public class Service {
   @Inject Logger logger;

   public void method() {
      logger.info("some log text");
  }
}
Run Code Online (Sandbox Code Playgroud)

现在使用mockito的@InjectMocks注释创建可测试的实例非常容易.它将注入嘲笑和间谍.

@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {
  @Spy Logger logger = LoggerFactory.getLogger(Service.class);

  @InjectMocks Service service;

  @Test public void test() {
     // Given
     // When
     service.method();
     // Then
  }
Run Code Online (Sandbox Code Playgroud)

我需要将一些工作记录器注入我正在测试的服务类中.记录器框架是slf4j,首选记录器是logback.但不幸的Logger是,logback的实现是最终的,所以我不能窥探它,它会导致运行时异常.

我想到的解决方法:

  • 使用反射来初始化服务上的记录器属性(穷人的注射)
  • 实现一个spyable(非最终)记录器包装器,它委托给最终的logback记录器

但对于那些(那些)问题,是否有一个干净或至少更好的解决方案?

java logback mockito cdi

7
推荐指数
1
解决办法
1454
查看次数

Hibernate使得Weld没有在Java SE中初始化

所以,我有一个使用Weld 1.2进行依赖注入的基本Java SE程序.

一切正常,直到我将Hibernate放入混合中,并使用以下pom.xml依赖项:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
</dependency>
<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se</artifactId>
    <version>2.2.4.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.3.6.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

Hibernate是添加的依赖项,使其中断.这是我的入门课程:

public class EntryPoint {
    public static void main( String[] ARGV ) {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();

        Application application = container.instance().select(Application.class).get();

        application.testFetch();

        weld.shutdown();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在包含Hibernate依赖项后尝试运行它时,这是我的输出:

Sep 11, 2014 11:13:44 PM org.jboss.weld.bootstrap.WeldStartup <clinit>
INFO: WELD-000900: 2.2.4 (Final)
Sep 11, 2014 11:13:44 PM org.jboss.weld.bootstrap.WeldStartup startContainer
INFO: WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. …
Run Code Online (Sandbox Code Playgroud)

java hibernate maven cdi weld

7
推荐指数
1
解决办法
5306
查看次数

为什么无状态bean被视为伪范围并且不能具有循环依赖性?

使用Wildfly 8.1我有几个bean,我尝试将几个EJB互相注入.可以说我有3个豆子:

@Stateless 
public class A{
  @Inject
  private B b;
}

@Stateless 
public class B{
  @Inject
  private C c;
}

@Stateless 
public class C{
  @Inject
  private A a;
}
Run Code Online (Sandbox Code Playgroud)

显然,我有循环依赖.根据规格:

容器需要支持bean依赖关系图中的循环,其中参与每个循环依赖关系的至少一个bean具有正常范围

在容器中的代码上运行会导致表单错误:

org.jboss.weld.exceptions.DeploymentException:WELD-001443:伪范围bean具有循环依赖关系.依赖路径:

-Session bean [带有限定符的A类[@Default @Any]; 本地接口是[A] BackedAnnotatedField] @Inject private B,

[..]

我的问题是:@Stateless bean的范围是什么?它默认是@Dependent吗?最重要的是我如何在无状态会话bean之间启用循环依赖?

对不起,如果这个问题太琐碎了.我将非常感谢任何可以解释所呈现行为的进一步阅读资源.提前致谢.

更新 好了.我找到了解决方法.我使用@EJB注释而不是@Inject,但这并没有解释@Inject的奇怪行为.这个问题仍未解决,但正如Mika所说,CDI规范和Weld RI都可能是未解决的问题.

ejb java-ee cdi ejb-3.0 wildfly

7
推荐指数
1
解决办法
5281
查看次数

Stateless Session Beans和Request Scoped bean之间有什么区别

我知道无状态会话Bean是指EJB bean,而Request Scoped是指CDI bean(或JSF托管bean),因此我将首先从Java EE Tutoriel中提供它们的两个定义.

无状态会话Bean定义:

无状态会话bean不与客户端保持会话状态.当客户端调用无状态bean的方法时,bean的实例变量可能包含特定于该客户端的状态,但仅限于调用期间.方法完成后,不应保留特定于客户端的状态.

CDI Request Scoped定义:

用户在单个HTTP请求中与Web应用程序的交互.

我从这两个定义中理解的是,无状态会话bean的概念与请求范围概念相同,但我不确定,因为命名"会话"使我感到困惑.所以,我问自己是否是这种情况(相同的概念),也许他们会有类似的命名(使用请求而不是会话).

所以,我的问题是:EJB无状态会话bean和CDI/JSF请求范围bean之间是否有任何概念上的区别?

jsf scope ejb java-ee cdi

7
推荐指数
1
解决办法
3915
查看次数

openshift pods的CrashLoopBackOff状态是什么?

有一个以上的例子,我从一个以openshift原点运行的pod中看到了这个状态.在这种情况下,这是cdi camel示例的快速入门.我能够在本地成功构建和运行它(非openshift)但是当我尝试在我的本地openshift(使用mvn -Pf8-local-deploy)上部署时,我得到了这个特定示例的输出(为了相关性而剪断): -

[vagrant@vagrant camel]$ oc get pods NAME READY STATUS RESTARTS AGE cdi-camel-z4czs 0/1 CrashLoopBackOff 4 2m

日志尾巴如下: -

  Error occurred during initialization of VM
  Error opening zip file or JAR manifest missing : agents/jolokia.jar
  agent library failed to init: instrument
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个问题吗?

apache-camel cdi fabric8 openshift-origin

7
推荐指数
2
解决办法
9148
查看次数

Jersey / CDI 2.0 / Weld 3.0所需的依赖项

我正在尝试将Jersey项目从2.25更新到2.27

从2.26版开始,Jersey是Java EE 8的一部分,因此我还决定将我的项目从Java EE 7更新到Java EE 8,并从JAX-RS 2.0 / CDI 1.x / Weld2.x / Apache Tomcat 8更新到JAX-RS 2.1 / CDI 2.0 / Weld 3.0 / Apache Tomcat 9

问题是我无法弄清楚我需要在项目(Maven项目,pom.xml)中包含的确切依赖项

我尝试过的事情:

  • 我已按照指示回答在Tomcat上安装Weld
  • 最新的Jersey文档似乎并未涵盖这种情况。无论如何,我试图模仿CDI webapp示例中包含的依赖项
  • Weld 2.4到3.0迁移指南
  • ......终于,在我绝望的时候,下面的依赖关系的不同组合:cdi-apijersey-hk2javax.injectjersey-cdi1xjersey-cdi1x-servletweld-servletweld-servlet-coreweld-servlet-shadedweld-core-impl

这些是我当前的依赖项(pom.xml):

<!-- Java EE  -->
<dependency> …
Run Code Online (Sandbox Code Playgroud)

jersey cdi weld

7
推荐指数
1
解决办法
1436
查看次数