我手头有一个小而完整的Java EE 6应用程序.
传统的注释正在使用: @Resource,@EJB,@Singleton,@PostConstruct,@PreDestroy,@PersistenceContext,@ManagedBean,@ManagedProperty,@RequestScope,@ApplicationScope,...
我想评估是否有必要引入CDI,并标准化依赖注入,bean生命周期管理等的通用策略.
问题:有没有人知道将传统Java EE 6注释转换为CDI注释的好文章,示例或手册?
我有一个具有良好定义的界面的应用程序.它使用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,如果这是使模块开发人员的生活更轻松的话)
关于我应该在哪里找出这个问题的任何建议?(如果我先找到答案,我会在这里发布答案)
@Named没有附加@...Scoped注释的CDI bean 是否有任何默认范围?我没有在Weld官方文档中找到任何相关信息.
一个@Namedbean可以在JSF访问而无需额外的注解,所以一些隐含的范围似乎有可能.
谢谢
我目前正在使用RichFaces评估Java EE 6/JSF 2.1.
声明为的bean
@ManagedBean
@ViewScoped
Run Code Online (Sandbox Code Playgroud)
由于CDI bean没有ViewScope,我试图将bean声明为:
@Named
@ConversationScoped
Run Code Online (Sandbox Code Playgroud)
现在,处理在步骤3中失败,因为步骤1中设置的值(已选中)不再可用.
我必须使用Conversation.begin()和Conversation.end()方法吗?
如果是这样,哪里可以调用它们的好地方?
我正在开发一个需要访问两个不同数据库服务器(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) 在muliple类threadsafe中,EntityManager @Inject [ed]如下所示?
@PersistenceContext(unitName="blah")
private EntityManager em;
Run Code Online (Sandbox Code Playgroud)
我需要编写一个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 EE 6的一个优点是新的依赖注入框架 - 带有Weld参考实现的CDI - 它促使我们以一种与实现无关的方式开始内部迁移到JSR-330,其明确的目标是能够拥有核心jar被冻结,然后能够添加额外的罐子,提供新的模块替换核心jar中的功能.
我现在正在与Weld一起完成上述工作,坦率地说,封面背后有太多的魔力.无论是工作还是不工作,默认情况下它不会提供很多帮助,因此您可以调查错误并修复它.
我希望有切换开关可以轻松实现以下功能:
换句话说,我需要更详细地看待决策过程.出于某种原因,Guice并不需要这样做,也许是因为魔法少得多,也许是因为错误消息非常好.
您如何调试Weld应用程序,以及它有多大帮助?
我正在使用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 EE,发现Java EE提供了两种类型的注入机制
请指导我理解资源注入和依赖注入之间的区别.
cdi ×10
java ×8
java-ee ×3
java-ee-6 ×3
jboss-weld ×3
jpa ×2
jsf-2 ×2
concurrency ×1
java-ee-7 ×1
jsf ×1
jsr330 ×1
jta ×1
modular ×1
named ×1
view-scope ×1