我在eclipse helios中尝试JSF2 CDI(焊接)bean而不是ManagedBeans,但不能在我的Namedbean 的表达式语言中自动完成(#{myNamedBean.Ctrl+ Space}thingy)
但是使用ManagedBeans的OTOH,内容辅助效果很好.. Eclipse Helios中是否支持CDI bean的内容辅助?
有人有这方面的经验吗?
我有一个Singleton EJB(javax.ejb.Singleton版本.叹气.),它有一个CDI观察者方法.当我尝试将此部署到glassfish 3.1时,服务器无法在没有任何实际解释的情况下部署EAR文件 - 只是说在部署期间没有任何更多细节存在异常.
SEVERE: Exception while loading the app
SEVERE: Exception while shutting down application container
....
SEVERE: Exception while shutting down application container : java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)
这是CDI事件监听器:
public void updateFromGranule(@Observes @CloudMask GranuleAvailableEvent granuleEvent) {
LOG.info("updating cloud map");
update(granuleEvent.getGranule(), CloudMask.class);
fireUpdate();
}
Run Code Online (Sandbox Code Playgroud)
如果我将Singleton bean更改为只是一个@ApplicationScoped bean,那么app就可以正常部署.同样,如果我删除CDI事件观察器方法,应用程序部署正常.我实际上需要将该类作为EJB单例,因为我想要EJB的事务,线程安全等,所以将它作为@ApplicationScoped POJO留下来对我来说并没有多大用处.这个问题似乎并不局限于Singleton bean - 我已经通过将注释更改为@Stateless和@Stateful进行了实验,我得到了相同的问题.
在我看来,这可能是Weld中的一个错误,也许Weld和EJB正在争论他们如何代理该方法 - 可能是EJB需要添加一个拦截器类并包装该方法以确保线程安全,而Weld正在尝试做某事否则使事件监听器工作?
我在这里误解了什么,CDI事件处理程序是否应该在EJB上使用(在这种情况下应该有来自glassfish的更好的错误消息) - 或者这实际上只是CDI或EJB实现中的错误?
我面临以下问题:在一个页面中,我列出了我的应用程序的所有用户,并为每个用户都有一个"编辑"按钮,这是一个"GET"链接?id=<userid>.
编辑页面具有<f:viewParam name="id" value="#{editUserBean.id}"/>元数据.
如果我输入了一些输入错误并提交(我使用CDI Weld Bean验证),页面会再次显示,但我丢失?id=...了URL,因此丢失了我正在编辑的用户的用户ID.
我看过JSF验证错误中描述的类似问题,丢失了值,但是带有inputhidden的解决方案(或更糟糕的是,使用tomahawk,看起来有点过分)需要大量的uggly代码.
我尝试用CDI添加一个"对话",它正在工作,但它看起来对我来说太过分了.
在验证错误的情况下,JSF中是否存在一个简单的解决方案来保留视图参数?
[我的环境:Tomcat7 + MyFaces 2.1.0 + Hibernate Validator 4.2.0 + CDI(Weld)1.1.2]
我对以下情况中使用哪个有点困惑:
假设servlet创建一个处理用户http会话的Application,应用程序是这样的:
public class Application extends AbstractHTTPApplication {
@Inject
private Instance<MainView> mainView;
public void setupApplication() {
this.setView( mainView.get() );
}
Run Code Online (Sandbox Code Playgroud)
后来我有一个@SessionScopedbean SSB,我想注入每个用户的bean:
@SessionScoped
public class SSB {}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试使用常规@Inject SSB ssb;字段时MainView,我没有SSB为每个用户获取新内容:
public class MainView {
@Inject
private SSB usersSSB;
public someMethod() {
usersSSB.doSomething();
System.identityHashCode( usersSSB );
}
}
Run Code Online (Sandbox Code Playgroud)
在两个用户的测试中,我在两个用户的会话中得到了相同的实例usersSSB.我认为这不可能......我想,既然SSB是SessionScoped,每个用户会话都会有一个新的,无论它在哪里@Inject编辑,它都会引用该用户的SSB.
相反,我试过:
public class MainView {
@Inject
private Instance<SSB> usersSSB;
public someMethod() {
usersSSB.get().doSomething(); …Run Code Online (Sandbox Code Playgroud) 在具有CDI的Java EE平台中,能够注入POJO类的实例.以非常简单的方式,我们需要使用@Inject注释来注入某个接口的默认实例.我们也可以使用限定符为我们的领域注入具体的类.但这些解决方案相当静态.
我需要一些更具动力的注入模型.
让我来介绍一下我的问题:假设我们有接口Animal和三个实现该接口的类:Ant,Dog,Elephant.我想动态地注入这三个类中的一个的实例,它依赖于一些变量,如字符串(动物名称).在Java SE中我会这样做:
Map<String, Animal> animalMap = new HashMap<>();
animalMap.put("ant", new Ant());
animalMap.put("dog", new Dog());
animalMap.put("elephant", new Elephant());
...
String animalName = ...;
Animal animal = animalMap.get(animalMap);
animal.doSomething();
Run Code Online (Sandbox Code Playgroud)
所以我需要这样的东西:
class AnimalManager {
@Inject // ?
private Animal animal; // ?
public void run(String animalName) {
// based on animalName get new instance of animal and run doSomething()
...
animal.doSomething(); // if animalName is "ant" call the doSomething on Ant class
}
}
Run Code Online (Sandbox Code Playgroud)
在所有实现Animal接口的类中,我需要使用带有@EJB注释的变量.
在Java EE中最好和最正确的方法是什么?
编辑:
好的,基于Svetlin Zarev和hwellmann的回应(谢谢!)我创建了这个: …
众所周知,建议使用注释javax.enterprise.context而不是javax.faces.bean它们被弃用.
我们都发现eager="true"带有@ApplicationScoped from javax.faces.bean和带有@PostConstruct方法的ManagedBeans 对于Web应用程序初始化非常有用,例如:从文件系统读取属性,初始化数据库连接等等...
示例:
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.annotation.PostConstruct;
@ApplicationScoped
@ManagedBean(eager=true)
public class someBean{
@PostConstruct
public void init(){
//Do all needed application initialization.
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,如果我使用注释,我怎么能得到相同的行为javax.enterprise.context.
注意:
@Startup注释fromjavax.ejb将有助于运行该代码,但仅在应用程序服务器启动时部署webapp时.
我正在使用部署在JBoss 7.1.1上的DeltaSpike 1.7.1和CDI 1.0(Weld 1.1.5).这是一个遗留项目,我无法改变我们正在使用的技术.
当我部署多个WAR文件(我知道CDI有问题只发生/曾与一个EAR内的多个WAR文件有问题,但我没有找到一个EAR文件之外的JBOSS实例的多个WAR文件什么.
请注意,每次部署项目时都不会发生问题,通常情况下,当我要求Jenkins同时构建和部署多个项目时,我会收到以下错误消息:
WELD-001318 Cannot resolve an ambiguous dependency between [Managed Bean [class org.apache.deltaspike.core.impl.scope.window.DefaultWindowContextQuotaHandler] with qualifiers [@Any @Default], Managed Bean [class org.apache.deltaspike.jsf.impl.scope.window.JsfWindowContextQuotaHandler] with qualifiers [@Any @Default]]
我试图摆脱DeltaSpike,但项目严重依赖于@ViewAccessScoped注释,这将浪费大量时间来改变它.
我有一个工作@ManagedBean,我想用@Named + @RequestScoped豆替代.
// Before
@ManagedBean
public class Login {
...
}
// After
import javax.enterprise.context.RequestScoped;
@Named
@RequestScoped
public class Login {
...
}
Run Code Online (Sandbox Code Playgroud)
只要我使用,一切都很好@ManagedBean.@Named没有@RequestScoped工作,但为每个EL表达式创建一个新实例.@Named + @RequestScoped但是会产生异常:当请求缓存不活动时,无法添加请求范围的缓存项
java.lang.IllegalStateException: Unable to add request scoped cache item when request cache is not active
at org.jboss.weld.context.cache.RequestScopedBeanCache.addItem(RequestScopedBeanCache.java:51)
at de.prosis.dafe.presentation.Login$Proxy$_$$_WeldClientProxy.getUsername(Login$Proxy$_$$_WeldClientProxy.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:302)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
at …Run Code Online (Sandbox Code Playgroud) 我刚刚在GlassFish服务器下发生了臭名昭着的JavaEE CDI错误:
org.glassfish.deployment.common.DeploymentException: CDI deployment failure:Exception List with 2 exceptions:
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001437 Normal scoped bean class ASController is not proxyable because the type is final or it contains a final method public final void ASController.selectPath(org.primefaces.event.NodeSelectEvent) - Managed Bean [class ASController] with qualifiers [@Default @Any @Named].
Run Code Online (Sandbox Code Playgroud)
因为他不喜欢CDI bean中的final方法,所以错误很明显,但是我无法理解为什么.
在这个链接
http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html_single/#d0e1429
他们解释说它与序列化有关但我不明白为什么用最终方法序列化类应该比使用非最终方法更难.
我最近发现了这个神奇的工具Forge.感谢参与制作它的每个人.我下载了最新版本3.7.2并在我的路径中添加了伪造可执行文件.
除了我之外,一切都很顺利
--version,可以设置为2.2或2.0,具体取决于当前的代码库要求.当我运行时,scaffold-setup --provider Faces我收到以下消息:
[edsnext]$ scaffold-setup --provider Faces
***ERROR*** Could not install CDI.
***SUCCESS*** Scaffold was setup successfully.
运行cdi-setup给出完全相同的错误.
我需要做些什么才能解决这个问题?
编辑:下面是在锻造内部运行的addon-list的输出
Currently installed addons:
org.jboss.forge.addon:addon-manager,3.7.2.Final
org.jboss.forge.addon:addon-manager-spi,3.7.2.Final
org.jboss.forge.addon:addons,3.7.2.Final
org.jboss.forge.addon:angularjs,2.1.7.Final
org.jboss.forge.addon:bean-validation,3.7.2.Final
org.jboss.forge.addon:configuration,3.7.2.Final
org.jboss.forge.addon:convert,3.7.2.Final
org.jboss.forge.addon:core,3.7.2.Final
org.jboss.forge.addon:database-tools,3.7.2.Final
org.jboss.forge.addon:dependencies,3.7.2.Final
org.jboss.forge.addon:dev-tools-java,3.7.2.Final
org.jboss.forge.addon:environment,3.7.2.Final
org.jboss.forge.addon:facets,3.7.2.Final
org.jboss.forge.addon:git,3.7.2.Final
org.jboss.forge.addon:javaee,3.7.2.Final
org.jboss.forge.addon:javaee-spi,3.7.2.Final
org.jboss.forge.addon:maven,3.7.2.Final
org.jboss.forge.addon:parser-java,3.7.2.Final
org.jboss.forge.addon:parser-json,3.7.2.Final
org.jboss.forge.addon:parser-xml,3.7.2.Final
org.jboss.forge.addon:parser-yaml,3.7.2.Final
org.jboss.forge.addon:projects,3.7.2.Final
org.jboss.forge.addon:projects-generic,3.7.2.Final
org.jboss.forge.addon:resources,3.7.2.Final
org.jboss.forge.addon:rest-client,3.7.2.Final
org.jboss.forge.addon:scaffold,3.7.2.Final
org.jboss.forge.addon:scaffold-faces,3.7.2.Final
org.jboss.forge.addon:scaffold-spi,3.7.2.Final
org.jboss.forge.addon:script,3.7.2.Final
org.jboss.forge.addon:shell,3.7.2.Final
org.jboss.forge.addon:shell-spi,3.7.2.Final
org.jboss.forge.addon:slf4j,1.7.13
org.jboss.forge.addon:templates,3.7.2.Final
org.jboss.forge.addon:templates-spi,3.7.2.Final
org.jboss.forge.addon:testing,3.7.2.Final
org.jboss.forge.addon:text,3.7.2.Final
org.jboss.forge.addon:ui,3.7.2.Final
org.jboss.forge.addon:ui-spi,3.7.2.Final
org.jboss.forge.furnace.container:cdi,2.26.2.Final
org.jboss.forge.furnace.container:simple,2.26.2.Final
org.primefaces.forge:primefaces-forge-addon,1.0.0-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)
编辑2:添加了POM文件.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" …Run Code Online (Sandbox Code Playgroud) cdi ×10
java-ee ×5
java ×3
jboss-weld ×3
jsf ×3
jsf-2 ×3
java-ee-6 ×2
deltaspike ×1
eclipse ×1
ejb-3.1 ×1
glassfish ×1
helios ×1
jboss-forge ×1
jboss7.x ×1
managed-bean ×1
wildfly-10 ×1