我有一些@SessionScopedCDI 豆。以前它们都是 JSF 托管 Bean(从 JSF 托管 Bean 更改为 CDI 托管 Bean)。
我正在执行以下操作,以删除用户成功下达在线订单后管理的一些会话范围的 JSF。
Map<String, Object> sessionMap = context.getSessionMap();
sessionMap.remove("cartBean");
sessionMap.remove("orderItems");
sessionMap.remove("reviewOrderBean");
sessionMap.remove("intermediateLocaleBean");
sessionMap.remove("localeBean");
sessionMap.remove("currencyRateBean");
sessionMap.remove("currency");
Run Code Online (Sandbox Code Playgroud)
以便订单处理完成后一切都设置为默认值。这与销毁/无效整个 HTTP 会话无关,在订单处理成功终止后,用户不得注销。
与 JSF 托管 bean 不同,CDI bean 通过某些 CDI 管理器实现(例如 Weld)存储到服务器内存中。因此,它们在会话映射中不可用 - Map<String, Object>。
对于 CDI bean,如何模拟这一点?
更新 :
焊接文档:
请记住,一旦 bean 绑定到上下文,它就会保留在该上下文中,直到该上下文被销毁。无法从上下文中手动删除 bean。如果您不希望 bean 无限期地驻留在会话中,请考虑使用另一个生命周期较短的作用域,例如请求或会话作用域。
所以我认为,很难在不破坏其他东西的情况下手动破坏一个 bean。
我正在编写一个在 Tomcat 上运行的 CDI 应用程序。我使用 Tomcat 7.0.62 和 Weld 2.2.12.Final 作为 CDI 实现。我正在使用 CDI,而不使用 JSF。
该应用程序由未启用 CDI 的调度程序 servlet 组成。调度程序包括启用 CDI 的 servlet 的输出来创建页面。
当调度程序 servlet 和 CDI servlet 都在同一个 Web 应用程序中时,它可以正常工作。但是,我需要 CDI servlet 位于不同的 Web 应用程序中,因此我执行了跨上下文包含。当我执行跨上下文包含时,CDI servlet 会生成输出,直到它尝试访问 @RequestScoped bean。Bean 访问失败,出现以下异常:
org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped
at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:708)
at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:90)
at org.jboss.weld.bean.ContextualInstanceStrategy$CachingContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:165)
at org.jboss.weld.bean.ContextualInstance.getIfExists(ContextualInstance.java:63)
at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:83)
...
Run Code Online (Sandbox Code Playgroud)
我也尝试过为调度程序 servlet 激活 CDI,但似乎没有任何区别。
在我看来,当包含 CDI servlet 时,CDI servlet 的请求上下文没有正确设置,而不是直接接收请求。
我已经搜索过这个网站,也通过谷歌搜索过,但没有找到匹配的问题/解决方案。我发现一个 tomcat 上下文设置“fireRequestListenersOnForwards=”true”,我将其应用于调度程序 servlet,但这并没有什么区别。
这是配置问题吗?任何人都可以提供有关如何解决这个问题的线索吗?
我会很感激!
背景资料:
存在问题的实际应用程序很大,因此我将其浓缩以了解损坏的本质。结果,我有两个战争文件。第一个 …
我已经获得了一个 CDI bean,它是使用以下代码以编程方式获得的:
MyBean bean = CDI.current().select(MyBean.class, qualifier).get();
Run Code Online (Sandbox Code Playgroud)
完成后,我是否需要使用销毁这个bean
CDI.current().destroy (bean);
Run Code Online (Sandbox Code Playgroud)
或者 bean 是否继承了我的类的范围?
在Wildfly 11 中部署我的test.war期间,我看到了几个警告:
09:45:32,714 WARN [org.jboss.weld.Validator] (MSC service thread 1-4) WELD-001478: Interceptor class org.apache.deltaspike.core.impl.throttling.ThrottledInterceptor is enabled for the application and for the bean archive test.war/WEB-INF/lib/deltaspike-core-impl-1.8.1.jar. It will only be invoked in the @Priority part of the chain.
09:45:32,714 WARN [org.jboss.weld.Validator] (MSC service thread 1-4) WELD-001478: Interceptor class org.apache.deltaspike.core.impl.lock.LockedInterceptor is enabled for the application and for the bean archive test.war/WEB-INF/lib/deltaspike-core-impl-1.8.1.jar. It will only be invoked in the @Priority part of the chain.
09:45:32,715 WARN [org.jboss.weld.Validator] (MSC service thread 1-4) …Run Code Online (Sandbox Code Playgroud) 如果@ApplicationScoped通过 获取 bean Instance<T>#get(),后续调用是否会get()重用同一实例(我确信ProxyObject使用了相同的实例)?
在我们的 JEE 应用程序中,我们创建了一个新注释@MyAnnotation,并将其设置在 CDI beans ( @ApplicationScoped ) 上。
然后我们有一个拦截器,它拦截所有带有@MyAnnotation注释的 bean 。
问题是它不适用于由@Produces方法创建的 bean。
这意味着拦截器没有被调用。
所以如果我们有这个类:
@ApplicationScoped
public class OtherClass
{
@Inject
private MyBean myBean;
public void f()
{
myBean.g();
}
}
Run Code Online (Sandbox Code Playgroud)
然后以下将起作用:
@ApplicationScoped
@MyAnnotation
public class MyBean
{
public void g() {}
}
Run Code Online (Sandbox Code Playgroud)
但下面的不会:
@ApplicationScoped
public class MyBeanProducer
{
@Produces
public MyBean create()
{
return new MyBean();
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让拦截器拦截使用 @Produces 创建的 CDI bean?
我有以下课程:
@ApplicationScoped
public class AppScopeTest {
@ConfigProperty(name = "my-config-prop")
String test;
private TestClass testclass;
@Inject
public AppScopeTest () {
this.testClass= new TestClass (test);
}
}
Run Code Online (Sandbox Code Playgroud)
我有一些类需要TestClass在创建该类后创建一个新实例。示例如上所示。但如果我这样做,类中的字符串 Test 始终为 null TestClass。
所以我的问题是如何读取配置属性并创建一个TestClass以该配置属性作为参数的新实例?
我不希望这是一个方法调用,因为AppScopeTest创建时我想要一个实例TestClass
我需要在我正在使用RESTEASY的休息应用程序上使用CDI功能.所以我按照手册的说明在我的应用程序上设置了resteasy-cdi模块,该模块在JBoss AS7上运行.
但是当我启动服务器时,我收到以下错误:
13:48:08,631 ERROR [org.apache.catalina.core.StandardContext](MSC服务线程1-4)由于先前的错误,上下文[/ MainService]启动失败:java.lang.IllegalArgumentException:重复的上下文初始化参数resteasy.injector .厂
我的web.xml如下:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<context-param>
<param-name>resteasy.injector.factory</param-name>
<param-value>org.jboss.resteasy.cdi.CdiInjectorFactory</param-value>
</context-param>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几种参数组合,并尝试在此线程中配置它,但没有成功.
在web.xml上指定javax.ws.rs.core.Application并禁用resteasy.scan也无法解决问题.
我的pom.xml包含以下内容:
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-cdi</artifactId>
<version>2.2.1.GA</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用和不使用神器resteasy-jarxs进行测试,以及像本文一样的依赖声明.
我真的迷路了.你有什么想法?我现在需要CDI或EJB来通过注入使用JPA的EntityManager.我知道没有它我就可以使用,但我更愿意这样,我可以探索JTA的集成和CDI未来的功能.
谢谢.
是否需要@Qualifier注释?我们不能只注入特定类型的实例吗?这似乎是一些额外的工作,因为我们必须为每个实现类创建注释类型.为了表明我的意思,以下是以下示例:
@Documented
@Retention(RUNTIME)
@Qualifier
public @interface AppleQ { }
@Documented
@Retention(RUNTIME)
@Qualifier
public @interface CheeseQ { }
public interface Eatable { }
@AppleQ
public class Apple implements Eatable { }
@CheeseQ
public class Cheese implements Eatable { }
public class Breakfast {
@Inject @AppleQ Eatable somethingToEat;
}
Run Code Online (Sandbox Code Playgroud)
VS
public interface Eatable { }
public class Apple implements Eatable { }
public class Cheese implements Eatable { }
public class Breakfast {
@Inject Apple somethingToEat;
}
Run Code Online (Sandbox Code Playgroud)