标签: cdi

从会话中删除特定的 CDI 托管 Bean

我有一些@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。

jsf cdi jsf-2.2

3
推荐指数
1
解决办法
2309
查看次数

包含的启用 CDI 的 Servlet 失败并出现 ContextNotActiveException:WELD-001303:

我正在编写一个在 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,但这并没有什么区别。

这是配置问题吗?任何人都可以提供有关如何解决这个问题的线索吗?

我会很感激!


背景资料:

存在问题的实际应用程序很大,因此我将其浓缩以了解损坏的本质。结果,我有两个战争文件。第一个 …

java tomcat servlets cdi weld

3
推荐指数
1
解决办法
1472
查看次数

为什么 Event.fireAsync() 需要 @ObservesAsync 注释?

在 CDI 2.0 中,可以通过调用异步触发事件Event.fireAsync(),然后使用带@ObservesAsync注释的侦听器侦听此事件。

为什么我们需要Event.firesAsync()@ObservesAsync

  • CDI 2.0 不能异步处理由 触发Event.fire()和捕获的事件@ObservesAsync吗?
  • 或者Event.fireAsync()反过来说,为什么 CDI 2.0 不能异步处理由和 cauguth触发的事件@Observes

java events cdi cdi-2.0 jakarta-ee

3
推荐指数
1
解决办法
1557
查看次数

我们是否需要销毁以编程方式获得的 CDI bean?

我已经获得了一个 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 是否继承了我的类的范围?

java cdi java-ee-7

3
推荐指数
1
解决办法
1778
查看次数

源自 deltaspike 的 wildfly 11 部署中的拦截器警告

在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)

cdi weld wildfly deltaspike

3
推荐指数
1
解决办法
793
查看次数

Instance#get() 是否为 CDI 中的 @ApplicationScoped beans 返回相同的实例?

如果@ApplicationScoped通过 获取 bean Instance<T>#get(),后续调用是否会get()重用同一实例(我确信ProxyObject使用了相同的实例)?

java cdi

3
推荐指数
1
解决办法
690
查看次数

拦截使用@Produces方法创建的CDI bean

在我们的 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?

interceptor cdi jakarta-ee

3
推荐指数
1
解决办法
395
查看次数

Java Quarkus 如何将 @ConfigProperty 传递给构造函数?

我有以下课程:

@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

java inject cdi quarkus

3
推荐指数
1
解决办法
988
查看次数

resteasy-cdi - 获取"重复上下文初始化参数resteasy.injector.factory"错误

我需要在我正在使用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未来的功能.

谢谢.

jboss jax-rs resteasy cdi

2
推荐指数
1
解决办法
5537
查看次数

需要注射@Qualifier

是否需要@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)

java-ee cdi

2
推荐指数
1
解决办法
5181
查看次数