我在Glassfish上玩CDI,但没有走得太远.一旦我在/ WebContent/META-INF中放置了一个empyt beans.xml,我就会收到以下错误:
无法为模块部署CDI_Example部署错误:CDI_Example:加载应用程序时出现异常:org.glassfish.deployment.common.DeploymentException:WELD-001201加载beans.xml时出错URL:null
Weld文档说文件可能是空的,但看起来Glassfish v3需要文件中的任何内容.
有人有个主意吗?
谢谢
我发布了几个问题,但还没有得到任何答复.我在这里陈述的所有内容都涉及JSF 2.0.*.
典型的bean包含要在页面上显示的信息.基于Web的通用业务应用程序是一组页面,其中每个页面都包含由多个xhtml页面表示的视图编辑保存状态.所以我们创建一个bean来管理这些状态.但是我将很快描述几个问题:
1)每个页面都是不同的视图,因此强制您将bean放入会话范围.它会使会话存储膨胀.
2)在视图之间传递参数.为了编辑文档,应该知道文档的ID或/和另一组对象.将它们放入会话中并不是一个好的决定(膨胀的会话反模式).
到目前为止,已经尝试了几种纠正这种情况的尝试.
a)t:saveState.多年来它一直在发挥作用.但现在我们正在摆脱它.b)接缝谈话.在谈话结束的确切时刻,它已经施加了很多问题.超时不是一个容易设置的参数,因为我们不知道业务用户需要多长时间,例如,编辑文档.对我们来说不是解决方案.
c)CODI(未尝试)它似乎是一个很好的JSR 299实现,并且可以解决所有问题,但它几乎没有文件记录,并且,因为作为扩展,坚持WELD这是另一个框架,我们只是想使用JSF的所有功能.
d)弹簧网络流程.嗯,这是一个非常好的框架,大量记录,伟大的IOC容器,流量范围和它提供的所有其他好东西可以是一种补救措施.它解决了多重标签问题(这是我的措辞,所以请原谅我,如果不清楚我得到了什么).想象一下,我们有一个编辑页面和视图范围的bean,我们正在填写表单.如果用户在新选项卡中打开另一个页面,则会触发GET请求并且bean超出范围.Web流可以识别这样的问题,并在打开新选项卡时启动新流程.
(网络流程的延续)但它是单片的,将迫使我们重写整个项目.是的,我知道它支持JSF,我已经测试过了一段时间,看看它是否符合要求.它不是因为它的安全性.不幸的是,我们没有时间也没有资源从头开始构建新项目.
我们几乎没有解决方案.JSF是一个很好的框架,已经过广泛测试并在许多项目中使用.但是开发人员拒绝在其中加入CDI.
任何人都可以推荐使用单个bean编辑视图保存问题的任何解决方案吗?任何建筑建议都会有很大的帮助.非常感谢你提前.
我在JBoss AS 7.1.0.Final上运行的耳朵应用程序包含两个jar:
lib/one.jarlib/two.jar两个罐子都是CDI bean档案.
这two.jar取决于one.jar.
班级装饰是在one.jar.
装饰者课程在 two.jar
如果装饰在声明beans.xml中two.jar,它们不会启用.这是否按预期工作?
由于one.jar开发独立于two.jar并且不依赖于two.jar,我希望装饰器的声明(启用)在存档装饰器类的存档中.
如何启用装饰器类而不用使用类修饰的类更改存档?
我正在使用一个API,它以XXXLocalServiceUtil类的形式公开服务,这些类是单例对象的静态包装器.我想要注入XXXLocalService对象本身,而不是使用静态XXXLocalServiceUtil方法,直接在我的代码中使用它们,例如:
@Named
public class MyMailingService {
@Inject UserLocalService userService;
public String mailUser(String email) {
User user = userService.getUser(email);
emailUser(user);
}
}
Run Code Online (Sandbox Code Playgroud)
并配置我applicationContext.xml喜欢:
<beans ...>
<bean class="x.y.z.UserLocalServiceUtil" factory-method="getService"/>
<bean class="x.y.z.CompanyLocalServiceUtil" factory-method="getService"/>
...
</beans>
Run Code Online (Sandbox Code Playgroud)
这非常有效.现在,我正在谈论的这个API有大约100个这样的XXXLocalServiceUtil类,每个类都有自己的静态getService方法,它返回实际的服务.我没有在我的列表中列出所有这些服务,而是applicationContext.xml让Spring为我注入的每个XXXLocalService找到正确的XXXLocalServiceUtil类.所以我需要的是某种动态bean工厂,它会为我做这项工作,当然是在延迟加载的基础上.
谁知道如何轻松实现这一目标?
我正在尝试建立一个基于JBoss AS7的Web应用程序堆栈,用于满足以下要求的小规模研究原型和学生项目:
我想使用与Ajax相关的范围,例如ViewScope - 或者可能是MyFaces Orchestra中的(View)AccessScope - 用于我的托管bean,以及PrimeFaces组件.
基于JPA的持久性应该相当简单,无需处理OpenSessionInView模式等.我对JPA2的主要问题是可怕的LazyInitializationException,尤其是在AJAX调用中.我不要求在谈话手动控制.
我希望尽可能少地使用依赖项,因此主要依赖于JBoss AS7附带的内容.
现在,我已经建立了一个项目,其中包含以下(主要是提供的)Maven依赖项:
到目前为止看起来相当苗条.缺少的是对JSF特定范围的进一步支持,并且当在JSF页面中迭代集合时,我总是得到一个LazyInitializationException.现在,我的持久性服务类看起来像这样:
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
@Stateful @RequestScoped
public class TestEntityService implements Serializable {
@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager entityManager;
// ... some methods working with the entityManager ...
}
Run Code Online (Sandbox Code Playgroud)
和我的ResourceFactory bean:
public class ResourceFactory {
@Produces @PersistenceUnit
private EntityManagerFactory entityManagerFactory;
}
Run Code Online (Sandbox Code Playgroud)
我尝试过失败与组合@Named代替@Stateful或@SessionScoped代替@RequestScoped.然而,我发现添加Seam 3 Persistence,Solder&Faces模块似乎可以解决我的大多数问题,但这会为我的项目增加大量的新依赖项(例如,seam-security,prettyfaces,drools,joda-time和其他依赖项) ).
我的问题是: …
为什么有可能@Inject一个@StatelessEJB到@SessionScopedManaged Bean的?
我只是非常好奇,因为无法将@RequestScopedManaged Bean中的SessionScopedManaged Bean用作托管属性.
我尝试学习JSF并遇到与ManagedProperty相关的问题.但是我试图使用它,它总是失败 - null异常指针.我做错了什么?我在stackoverflow上读过一些"类似的帖子",但它们对我没有帮助.(我使用GlassFish 4.0,JSF 2.2,JDK 1.7,Netbeans 7.3.1(Java EE pack)和Java EE 6.0)
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
Hello from Facelets
<br/>
User: #{books.user.name}<br/>
1: #{param.pageId}<br/>
2: #{books.pageId}<br/>
<h:form>
<h:inputText value="#{user.name}" /><br/>
<h:inputText value="#{books.v1}" /><br/>
<h:inputText value="#{books.v2}" /><br/>
<h:inputText value="#{books.result}" /><br/>
<h:commandButton value="dodaj" action="#{books.add}" />
</h:form>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
书
/*
* To change this template, choose Tools | Templates
* and open the template in the editor. …Run Code Online (Sandbox Code Playgroud) 基本上,我需要一种方法来禁用一个(框架提供)@Produces方法,而不是使用我自己的@Produces方法.
更具体地说,我正在使用jBPM 6并试图让它在容器内正常工作.在HumanTaskServiceProducer使用流口水的EnvironmentFactory,它总是产生一个新的Environment.由于某种原因Environment,用于缓存内容的代码EnvironmentFactory被注释掉了.
这意味着jBPM选择JTA事务管理器而不是Container事务管理器.我正在尝试为正确设置环境而不是使用默认环境的任务服务提供我自己的生产者.
有谁知道指定生产者使用的方法?希望我尝试将其指定为@Alternative,但这似乎没有奏效.无论是那种,还是指定环境的方式HumanTaskServiceProducer.
目前,我正在使用PersistenceContext来注入EntityManager.EM完美注入.
@Stateless
public StatelessSessionBean implements StatelessSessionBeanLocal {
@PersistenceContext(unitName = "MyPersistenceUnit")
private EntityManager em;
@Override
public Collection<MyObject> getAllObjects(){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriqQuery<MyObject> query = cb.createQuery(MyObject.class);
query.from(MyObject);
return em.createQuery(query).getResultList();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我尝试装饰豆子,突然间em没有被注射.我得到一个NullPointerException.
@Decorator
public StatelessSessionBeanDecorator implements StatelessSessionBeanLocal {
@Inject
@Delegate
@Any
StatelessSessionBeanLocal sb
@Override
public Collection<MyObject> getAllObjects(){
System.out.println("Decorated method!");
return sb.getAllObjects();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道EJB和CDI是两个完全不同的管理器,所以那个人不了解另一个.我期望@PersistenceContext是一个EJB注入点,而@Inject是一个CDI注入点.我该怎么做才能解决这个问题并让EntityManager按照它应该注入?
我正在使用JPA 2.1,我有这样的事情
public class EntityManagerProducer {
@Produces
@PersistenceContext(unitName="first_PU")
private EntityManager em;
...
Run Code Online (Sandbox Code Playgroud)
如何动态修改unitNamein @PersistenceContext(unitName = "somer_PU")以使用其他实体管理器?这可能吗?
非常重要的更新
我有一个已部署的应用程序,persistence.xml看起来像这样:
<persistence-unit name="db1" transaction-type="JTA">
<jta-data-source>java:/jboss/datasources/PostgresDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.cache.use_second_level_cache" value="false"/>
<property name="hibernate.jdbc.batch_size" value="50"/>
<property name="hibernate.jdbc.batch_versioned_data" value="true"/>
<property name="hibernate.order_inserts" value="true"/>
<property name="hibernate.order_updates" value="true"/>
<property name="hibernate.generate_statistics" value="true"/>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="jboss.entity.manager.jndi.name" value="java:app/entitymanager/db1"/>
<property name="jboss.entity.manager.factory.jndi.name" value="java:app/entitymanagerfactory/db1"/>
</properties>
Run Code Online (Sandbox Code Playgroud)
在运行时,可以修改persistence.xml并添加另一个持久性单元,但我需要一种方法来通过传递持久性单元的名称来获取我需要的实体管理器,然后将其用于我想要的内容.然后我可以提供另一个持久性单元的名称,并获得一个不同的实体管理器.当然我希望交易过程仍然是容器管理的.