标签: cdi

Java EE 6:切换到CDI - 最佳资源

我手头有一个小而完整的Java EE 6应用程序.

传统的注释正在使用: @Resource,@EJB,@Singleton,@PostConstruct,@PreDestroy,@PersistenceContext,@ManagedBean,@ManagedProperty,@RequestScope,@ApplicationScope,...

我想评估是否有必要引入CDI,并标准化依赖注入,bean生命周期管理等的通用策略.

问题:有没有人知道将传统Java EE 6注释转换为CDI注释的好文章,示例或手册?

dependency-injection java-ee cdi java-ee-6

25
推荐指数
1
解决办法
9164
查看次数

如何创建模块化JSF 2.0应用程序?

我有一个具有良好定义的界面的应用程序.它使用CDI来解析模块,(特别是它使用API​​接口上的Instance <>注入点来解析模块)并通过接口传回各种数据而没有问题.我故意将API和实现分开,并且模块仅从API继承以避免紧密耦合,并且应用程序仅通过运行时依赖性知道模块,并且通过API完成数据传递.应用程序在没有模块的情况下运行正常,只需将jar放入WEB-INF/lib文件夹并重新启动应用服务器即可添加.

我遇到的问题是我希望模块创建视图的一部分,因此我想以可移植的方式调用JSF组件,或者从模块中执行包含以获取它渲染它的观点.我已经解决了我想要调用的模块,并准备好了对模块接口的引用.我最初认为这样做的方法是做一个ui:include要求模块提供它的视图模板的位置,但我不知道如何以有意义的方式回答该查询,因为视图解析是从应用程序完成的root,而不是库根.

执行摘要是我不知道如何使用JSF为.xhtml(模板/组件)文件从应用程序跳到库.

使用CC会很好,但是如何在运行时指定我想要一个特定的CC实例,而不是将其硬编码到页面中?

我当然可以直接调用应用程序代码并要求它进行标记,但这似乎是非常强大的,一旦我有了标记,我就不确定如何告诉JSF来评估它.也就是说,我可以想象一个组件可以获取资源路径,获取标记并对其进行评估,返回完成的标记,我只是不知道如何实现它.

如果可能的话,我宁愿避免强制模块开发人员采用重型UIComponent方法,这意味着要么采用动态方式执行ui:include(或某些等效方法),要么采用动态方式调用CC.(我不介意在应用程序中编写UIComponent方法ONCE,如果这是使模块开发人员的生活更轻松的话)

关于我应该在哪里找出这个问题的任何建议?(如果我先找到答案,我会在这里发布答案)

java modular cdi jsf-2 jboss-weld

25
推荐指数
2
解决办法
1万
查看次数

命名CDI bean的默认范围是什么?

@Named没有附加@...Scoped注释的CDI bean 是否有任何默认范围?我没有在Weld官方文档中找到任何相关信息.

一个@Namedbean可以在JSF访问而无需额外的注解,所以一些隐含的范围似乎有可能.

谢谢

java dependency-injection named cdi jboss-weld

24
推荐指数
1
解决办法
2万
查看次数

如何在JSF 2.0/2.1中用CDI替换@ManagedBean/@ViewScope

我目前正在使用RichFaces评估Java EE 6/JSF 2.1.

声明为的bean

@ManagedBean
@ViewScoped
Run Code Online (Sandbox Code Playgroud)
  1. 获取ID集(以准备例如删除操作).
  2. 通过JSF显示确认弹出窗口.
  3. 如果用户确认,则调用delete方法并删除在步骤1中存储了ID的行.

由于CDI bean没有ViewScope,我试图将bean声明为:

@Named
@ConversationScoped
Run Code Online (Sandbox Code Playgroud)

现在,处理在步骤3中失败,因为步骤1中设置的值(已选中)不再可用.

我必须使用Conversation.begin()Conversation.end()方法吗?

如果是这样,哪里可以调用它们的好地方?

jsf cdi jsf-2 view-scope

24
推荐指数
2
解决办法
2万
查看次数

为什么具有分离数据源的不同持久性单元会查询相同的数据源?

我正在开发一个需要访问两个不同数据库服务器(H2和Oracle)的webapp.容器是Apache Tomee 1.5.1,我使用Java EE堆栈,其中包含库(JSF,JPA,CDI,EJB等).

我正在尝试在XA事务中使用两个实体管理器从Oracle数据库中提取数据并在转换后将其保留在H2中,但无论我使用的实体管理器如何,所有查询都是针对H2数据库执行的.有帮助吗?

编辑:我发现,如果我尝试以相反的顺序访问实体管理器,它们的行为是相同的,但访问Oracle.即:实体经理留在第一个访问的数据库.

发生这种情况的EJB(service.getFoo()从JSF 调用):

@Named
@Stateless
public class Service {
    @Inject
    @OracleDatabase
    private EntityManager emOracle;

    @Inject
    @H2Database
    private EntityManager emH2;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public List<Foo> getFoo() {
        TypedQuery<Foo> q = emH2.createQuery(
                "SELECT x FROM Foo f", Foo.class);
        List<Foo> l = q.getResultList();
        if (l == null || l.isEmpty()) {
            update();
        }

        return q.getResultList();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void update() {
        // FAIL: This query executes against H2 with Oracle entity manager!
        List<Object[]> l = emOracle.createNativeQuery("SELECT …
Run Code Online (Sandbox Code Playgroud)

java jpa jta java-ee cdi

24
推荐指数
1
解决办法
2万
查看次数

Java CDI @PersistenceContext和线程安全

在muliple类threadsafe中,EntityManager @Inject [ed]如下所示?

@PersistenceContext(unitName="blah")
private EntityManager em;
Run Code Online (Sandbox Code Playgroud)

这个问题和这个问题似乎是针对Spring的.我正在使用Jave EE CDI服务

java cdi java-ee-6

23
推荐指数
3
解决办法
9625
查看次数

JEE6 @ApplicationScoped bean和并发

我需要编写一个bean来充当访问它的次数的计数器.

我正在考虑像这样使用@ApplicationScopedbeanAtomicInteger

@ApplicationScoped
class VisitsCounter {

    private AtomicInteger counter;

    @PostConstruct
    public void construct() {
        counter = new AtomicInteger(0);
    }

    public int visited() {
        return counter.incrementAndGet();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:在同时考虑多个请求时可以吗?或者我需要玩@ConcurrencyManagement@Lock注释吗?我想Atomic*应该这样做,但我不确定.

当我将线程安全集合作为字段时,同样适用吗?比如说我有

@ApplicationScoped
class ValuesHolder {

    private List<String> values;

    @PostConstruct
    public void construct() {
        values = Collections.synchronizedList(new LinkedList<String>());
    }

    public void insert(String value) {
        values.add(value);
    }

    public String remove(String value) {
        return values.remove(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

这些操作真的是线程安全的吗?

据说当修改bean的状态时应该使用并发注释和锁,但是如果我的列表已经处理了线程安全怎么办?

java concurrency java-ee cdi

23
推荐指数
1
解决办法
1万
查看次数

Weld/CDI最好的调试技巧是什么?

Java EE 6的一个优点是新的依赖注入框架 - 带有Weld参考实现的CDI - 它促使我们以一种与实现无关的方式开始内部迁移到JSR-330,其明确的目标是能够拥有核心jar被冻结,然后能够添加额外的罐子,提供新的模块替换核心jar中的功能.

我现在正在与Weld一起完成上述工作,坦率地说,封面背后有太多的魔力.无论是工作还是不工作,默认情况下它不会提供很多帮助,因此您可以调查错误并修复它.

我希望有切换开关可以轻松实现以下功能:

  • 扫描了哪些类路径条目以及在哪里?结果是什么?
  • 什么豆类可供注射哪一类?
  • 是什么导致给定的bean以后不被考虑?一个给定的罐子?

换句话说,我需要更详细地看待决策过程.出于某种原因,Guice并不需要这样做,也许是因为魔法少得多,也许是因为错误消息非常好.

您如何调试Weld应用程序,以及它有多大帮助?

java jsr330 cdi java-ee-6 jboss-weld

22
推荐指数
3
解决办法
7618
查看次数

使用CDI在Java EE应用程序中获取对EntityManager的引用

我正在使用Java EE 7.我想知道将JPA EntityManager注入应用程序范围的 CDI bean 的正确方法是什么.您不能只使用@PersistanceContext注释注入它,因为EntityManager实例不是线程安全的.假设我们希望EntityManager在每个HTTP请求处理的开始时创建我们,并在处理HTTP请求后关闭它们.我想到了两个选择:

1.创建一个请求范围的CDI bean,它具有对a的引用EntityManager,然后将bean注入到应用程序范围的CDI bean中.

import javax.enterprise.context.RequestScoped;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@RequestScoped
public class RequestScopedBean {

    @PersistenceContext
    private EntityManager entityManager;

    public EntityManager getEntityManager() {
        return entityManager;
    }
}
Run Code Online (Sandbox Code Playgroud)
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;

@ApplicationScoped
public class ApplicationScopedBean {

    @Inject
    private RequestScopedBean requestScopedBean;

    public void persistEntity(Object entity) {
        requestScopedBean.getEntityManager().persist(entity);
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,EntityManager将在创建时RequestScopedBean创建,并在RequestScopedBean销毁时关闭.现在我可以将注入移动到一些抽象类中以将其从中删除ApplicationScopedBean.

2.创建一个生成实例的生产者,EntityManager然后将EntityManager实例注入到应用程序范围的CDI bean中.

import …
Run Code Online (Sandbox Code Playgroud)

java jpa entitymanager cdi java-ee-7

22
推荐指数
2
解决办法
2万
查看次数

Java中的资源注入和依赖注入(CDI)有什么区别?

我一直在学习Java EE,发现Java EE提供了两种类型的注入机制

  1. 资源注入
  2. 依赖注入

请指导我理解资源注入和依赖注入之间的区别.

java dependency-injection cdi

22
推荐指数
4
解决办法
7448
查看次数