标签: cdi

从无状态EJB访问SessionScoped对象

我有一个SessionScoped类.对于每个用户访问,我需要一个自己的这个类的实例.一切都很好,很长一段时间.但是现在我还需要从后端访问这些对象,而无需任何用户交互.我确实有一个无状态的企业bean,但每当我想访问会话作用域对象时,我都会得到一个例外.一个简单的示例代码如下:

@SessionScoped
public class SessionObj implements Serializable {

    public String getValue() {
        return "Hello World";
    }
}

@Stateless
public class StatelessBean {

    private static final Logger LOG=Logger.getLogger(StatelessBean.class);

    @Inject
    private SessionObj sessionObj;

    public void test() {
        LOG.info("session object: "+sessionObj);
        LOG.info("Method call: "+sessionObj.getValue());
    }

}
Run Code Online (Sandbox Code Playgroud)

但调用测试方法的结果如下:

12:19:10,484 ERROR [org.jboss.as.ejb3.tx.CMTTxInterceptor] (EJB default - 6)    javax.ejb.EJBTransactionRolledbackException: WELD-001303 No active contexts for scope type javax.enterprise.context.SessionScoped
12:19:10,484 ERROR [org.jboss.ejb3.invocation] (EJB default - 6) JBAS014134: EJB Invocation failed on component StatelessBean for method public void package.StatelessBean.test(): javax.ejb.EJBTransactionRolledbackException: …
Run Code Online (Sandbox Code Playgroud)

java java-ee cdi

4
推荐指数
1
解决办法
1万
查看次数

删除/销毁会话范围的CDI托管bean

我有一个会话作用域CDI托管bean:

@Named
@SessionScoped 
public class SampleBean implements Serializable {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我需要在某个流程之后从会话中删除这个bean,我使用了以下代码,如下面的答案所示:

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.getSessionMap().remove("sampleBean");
Run Code Online (Sandbox Code Playgroud)

但是,它不起作用,并且SampleBean在会话中仍然存在.
我错过了什么吗?

session-scope destroy cdi jsf-2 managed-bean

4
推荐指数
1
解决办法
4050
查看次数

焊接 OSGi + Apache Felix = 找不到包

我将 Apache Felix 和weld-osgi 用于Java SE 应用程序。问题是在注入的 bean 中,我使用@ApplicationScoped了 package javax.enterprise.context.ApplicationScoped。但是weld-osgi-bundle-2.1.2.Final.

这个包存在于weld-se但不在 OSGi 包中。我怎么解决这个问题?

java osgi cdi jboss-weld jakarta-ee

4
推荐指数
1
解决办法
700
查看次数

没有bean符合注入到注入点的条件

我正在尝试使用 CDI 将 DAO 注入我的 ManagedBean

托管Bean:

import java.io.Serializable;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.timbrasil.network.dao.ColaboradorDao;
import br.com.timbrasil.network.modelo.Colaborador;

@SuppressWarnings("serial")
@Named
@RequestScoped
public class LoginBean implements Serializable{

    private Colaborador colaborador = new Colaborador();
    @Inject
    private ColaboradorDao dao;
Run Code Online (Sandbox Code Playgroud)

import java.io.Serializable;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;

import br.com.timbrasil.network.modelo.Colaborador;

@SuppressWarnings("serial")
@RequestScoped
public class ColaboradorDao implements Serializable{

    @Inject
    private EntityManager manager;

    public Colaborador buscaEmailESenha(Colaborador colaborador) {

        String jqpl = "select c from Colaborador c where c.email = :pEmail and c.senha …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection inversion-of-control cdi

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

CDI @Transactional REQUIRES_NEW 是否适用于本地方法

CDI @Transactional(Transactional.TxType.REQUIRES_NEW) 在同一个 bean 中调用时是否有效:

@Transactional
public void method1() {
    for(...) {
        method2();
    }
}

@Transactional(Transactional.TxType.REQUIRES_NEW)
public void method2() {
   ...
}
Run Code Online (Sandbox Code Playgroud)

我想它不起作用,因为代理无法拦截本地调用。在这种情况下,如果我想在新事务中管理 method2 的每次调用,推荐的使用模式是什么。显而易见的是创建另一个bean,但这是我不喜欢的。

jta cdi java-ee-7 jakarta-ee

4
推荐指数
1
解决办法
1813
查看次数

WELD-001409类型[EagerBeansRepository]的模棱两可的依赖项

我正在尝试将JSF应用程序迁移到CDI。我已作出以下更改:

  • 向WEB-INF添加了一个空bean.xml文件
  • 将@ManagedBean的更改为@Named
  • 将我必须拥有的所有范围更改为CDI范围(会话,视图,请求)
  • 将所有@EJB和@ManagedProperty更改为@Inject

但是,Omnifaces错误阻止了部署,因为我三次遇到以下错误:

org.jboss.weld.exceptions.DeploymentException:WELD-001409类型[EagerBeansRepository]的模棱两可的依赖项,在注入点[[BackedAnnotatedField] @Inject私有org.omnifaces.ApplicationListener.eagerBeansRepository]上带有限定符[@Default]。可能的依赖关系[[带限定符[@Any @Default的托管Bean [类org.omnifaces.cdi.eager.EagerBeansRepository]],带限定符[@Any @Default的托管Bean [类org.omnifaces.cdi.eager.EagerBeansRepository]] ]

我已降级为Omnifaces 1.8.1,并且部署成功。为什么Omnifaces 2.0导致此错误?

开发环境:

  • 玻璃鱼4
  • Omnifaces 2.0
  • JSF(Mojarra 2.2.0)
  • WELD-000900 2.0.0(SP1)

jsf glassfish cdi omnifaces weld

4
推荐指数
1
解决办法
3501
查看次数

如何告诉PMD忽略@PostConstruct未使用代码的方法


我们有一个项目,由PMD检查是否违反了未使用的私人方法.我们的问题是我们不知道是否可以忽略带有注释的私有方法@PostConstruct.

该规则定义如下:

<rule ref="rulesets/java/unusedcode.xml/UnusedPrivateMethod"/>
Run Code Online (Sandbox Code Playgroud)

编辑:

我的目标是定义一次以忽略带注释的方法.我想阻止@SupressWarnings在每种方法上写作.

java ejb pmd cdi

4
推荐指数
1
解决办法
1131
查看次数

Java EE 7 CDI手动实例化

我有一个带有@Inject注释的字段的类。我使用反射实例化了Class,但是我希望CDI注入实例来执行Class实例字段。有办法吗?

Object myInstanceWithDependecies = Class.forName(“com.package.MyClass").newInstance();
CDI.injectAll(myInstanceWithDependecies);//This is what i want
Run Code Online (Sandbox Code Playgroud)

有人知道该怎么做吗?如果有一种无需使用反射来扫描每个字段的方法,我将不胜感激。

提前致谢。

java java-ee cdi

4
推荐指数
1
解决办法
774
查看次数

不使用 beans.xml 注册 CDI 拦截器

我正在寻找一种以编程方式加载给定拦截器的方法。

我已经看到了一种为给定 bean 动态设置拦截器绑定的方法,但是该绑定的拦截器必须在 beans.xml 中定义。我知道我可以使用@Interceptors注释,但这样我就被绑定到一个特定的实现。

有没有办法加载拦截器(可能通过 CDI 扩展)? 或者一种让拦截器默认启用而无需声明的方法<interceptors></interceptors>

我正在使用 Weld-1.1.24

cdi weld jakarta-ee

4
推荐指数
1
解决办法
1288
查看次数

JAX-RS:无状态、单例、RequestScoped 混淆

我已经多次看到 JAXRS 资源的几种配置方式。

我的意思是,有时我看到它们被注释为@Singleton, @Stateless, @ApplicationScoped, @RequestScoped, 甚至没有任何注释或同时使用它们。

  • javax.enterprise.context.RequestScoped
  • javax.enterprise.context.ApplicationScoped
  • javax.ejb.Stateless
  • javax.ejb.Singleton
  • javax.inject.Singleton

我应该使用哪个注释?

有什么javax.ejb用JAXRS资源呢?

另一方面,我也想知道如何准确地使用@Context注释。

我的意思是,我已经看到这应用于参数,也在类字段中

@Path("entity")
public class EntityResource {

    @Context
    private Request request;

    @POST
    public Response create(Entity entity) {
        this.request...
    }

}
Run Code Online (Sandbox Code Playgroud)

或者,

@Path("entity")
public class EntityResource {

    @POST
    public Response create(Entity entity, @Context Request request) {
        request...
    }

}
Run Code Online (Sandbox Code Playgroud)

我将如何进行?

java jax-rs cdi

4
推荐指数
1
解决办法
2541
查看次数