新的JSR 299"Java EE的上下文和依赖注入"似乎基于"范围"的概念.
创建bean并将其与受支持的Scope之一相关联:Application,Session(映射到HTTP会话),Conversation和Request.
如果没有HTTP会话(例如,通过EJB远程公开功能的企业应用程序),使用CDI是否有意义,因为托管Bean不会与任何上下文相关联(因为它们不存在)?
在这种情况下甚至可以使用CDI吗?它会带来哪些优势?
我想知道如何在CDI(@ApplicationScoped,@SessionScoped和@RequestScoped)中应用不同的bean范围.我理解生命周期,但容器中的这些存储在哪里?我在JSF bean上使用这些注释.
这些bean如何存储在服务器上以及服务器如何知道哪些bean属于谁.
例如,是一个@SessionScoped存储在HTTPSession幕后对象中的bean ?bean是否@ApplicationScoped存储在地图实例变量中ServletContext?如果是这样,线程安全怎么样.我想我误解了它但是如果有人可以告诉我发生了什么,它们存储在哪里(不同的范围)会很好,服务器如何能够知道哪些bean属于谁...就像是否有其他任何ID (不仅是会话ID)?
我正在使用Java EE 6所有参考实现.
我有一个工作@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) 我在多模块maven项目中使用Vaadin-CDI,其中包含一个常用类所需的模块,如接口,抽象类等.我的问题是,我无法像往常一样对@Inject类进行anotated @UIScoped,它被置于另一个核心模块中.我仍然得到UnsatisfiedResolutionException
SEVERE: CDI Beans module deployment failed
javax.enterprise.inject.UnsatisfiedResolutionException: Api type [com.web.core.TestClass] is not found with the qualifiers
Qualifiers: [@javax.enterprise.inject.Default()]
for injection into Field Injection Point, field name : cls, Bean Owner : [DispUI, Name:null, WebBeans Type:MANAGED, API
Types:[com.vaadin.ui.AbstractComponent,java.util.EventListener,com.vaadin.event.MethodEventSource,com.vaadin.server.Abs
tractClientConnector,com.vaadin.server.VariableOwner,java.lang.Iterable,com.vaadin.ui.HasComponents$ComponentAttachDetac
hNotifier,java.lang.Object,java.io.Serializable,com.vaadin.ui.LegacyComponent,com.vaadin.event.ConnectorEventListener,co
m.vaadin.event.Action$Notifier,com.vaadin.ui.Component,com.vaadin.event.Action$Container,com.vaadin.ui.SingleComponentCo
ntainer,com.vaadin.ui.HasComponents,com.vaadin.server.Sizeable,com.vaadin.ui.Component$Focusable,com.vaadin.server.Clien
tConnector,com.vaadin.ui.AbstractSingleComponentContainer,com.vaadin.shared.Connector,com.web.disp.DispUI,com.vaa
din.ui.UI], Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]]
Run Code Online (Sandbox Code Playgroud)
我在IBM WebSphere Info中找到了一些名为2的建议.解决了一个不可满足的依赖关系. (可在此处找到http://pic.dhe.ibm.com/infocenter/wasinfo/v8r0/index.jsp?topic=%2Fcom.ibm.websphere.nd.multiplatform.doc%2Finfo%2Fae%2Fae%2Ftweb_troubleshoot_cdi. HTML).据此,我检查了我的项目的部署程序集属性,并正确添加了core.jar.
接下来我应该检查什么?非常感谢您的回答!
我正在尝试将@Named bean注入Junit测试.
这适用于我的ejb模块,但我的war模块中的相同方法失败了.我想知道为什么会这样org.apache.openejb.OpenEJBException: Creating application failed: couldn't start owb context.
我知道这看起来与在运行JUnit时注入了CDI bean的EJB 3.1问题中的问题相同,但它不能与在另一个模块中工作的相同.
源代码在这里:https://github.com/Crydust/guestbook
工作测试: guestbook/guestbook-ejb/src/test/java/be/crydust/guestbook/ejb/PostBoundaryTest.java
测试失败: guestbook/guestbook-web/src/test/java/be/crydust/guestbook/web/PostBackingTest.java
失败测试的来源(省略进口):
public class PostBackingTest {
private static EJBContainer ejbContainer;
@Inject
PostBacking cut;
@BeforeClass
public static void startTheContainer() {
ejbContainer = EJBContainer.createEJBContainer();
}
@Before
public void setUp() throws Exception {
ejbContainer.getContext().bind("inject", this);
}
@AfterClass
public static void afterClass() {
if (ejbContainer != null) {
ejbContainer.close();
}
}
// FIXME injection fails
@Test
public void …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
他们解释说它与序列化有关但我不明白为什么用最终方法序列化类应该比使用非最终方法更难.
在新的Glassfish 4.1中,缺少包含注释SessionScoped的包javax.enterprise.context.
CDI具有专业化的特征,我在Spring世界中寻找它.
细节.
在CDI中,@Specializes注释允许人们通过覆盖它来改变bean的行为.这对于该bean的用户是完全透明的,例如,如果我们有的话
public class OneBean {
public String whoAmI() { return "OneBean"; }
}
@Specializes
public class AnotherBean extends OneBean {
@Override
public String whoAmI() { return "AnotherBean"; }
}
Run Code Online (Sandbox Code Playgroud)
我们可以
public class SomewhereElse {
@Inject
OneBean oneBean; // we know nothing of AnotherBean here!
public void guessWhosThere() {
return oneBean.whoAmI(); // yet it returns "AnotherBean"
}
}
Run Code Online (Sandbox Code Playgroud)
只要OneBean实际使用和不使用,这就非常有用AnotherBean.例如,如果OneBeanin one.jar和AnotherBeanin another.jar,我们可以通过重新配置类路径来改变bean的行为.
题.Spring中是否也存在类似Specialization的东西?
我只能找到@Primary …
我能够部署一个与 Weld 配合良好的 RESTEasy 应用程序(这意味着我的 CDI 可以工作),但我在集成测试中遇到了一些问题。我收到此错误:
org.jboss.weld.exceptions.DeploymentException:
WELD-001408: Unsatisfied dependencies for type SomeService with qualifiers @Default
Run Code Online (Sandbox Code Playgroud)
测试时:
@RunWith(WeldJUnit4Runner.class)
public class SomeServiceIT {
@Inject
private SomeService service;
@Test
public void test() {
System.out.println(service);
}
}
Run Code Online (Sandbox Code Playgroud)
我日志中的最后一条消息是
DEBUG::WELD-000100: Weld initialized. Validating beans
Run Code Online (Sandbox Code Playgroud)
src/test/resources/META-INF/beans.xml 的内容:
<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"
version="1.1" bean-discovery-mode="all">
</beans>
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我尝试了该cdi-unit库并且它可以工作,但我需要使用我自己的库WeldJUnit4Runner,目前是:
public class WeldJUnit4Runner extends BlockJUnit4ClassRunner {
private final Weld weld;
private final WeldContainer container;
public WeldJUnit4Runner(Class<?> klass) throws InitializationError {
super(klass);
this.weld = new …Run Code Online (Sandbox Code Playgroud) 我最近发现了这个神奇的工具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 ×4
java ×3
ejb-3.1 ×2
java-ee-6 ×2
glassfish-4 ×1
jboss-forge ×1
jboss-weld ×1
jsf-2 ×1
junit ×1
spring ×1
subclass ×1
testing ×1
vaadin ×1
vaadin7 ×1
weld ×1
wildfly-10 ×1