我有一个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) 我有一个会话作用域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在会话中仍然存在.
我错过了什么吗?
我将 Apache Felix 和weld-osgi 用于Java SE 应用程序。问题是在注入的 bean 中,我使用@ApplicationScoped了 package javax.enterprise.context.ApplicationScoped。但是weld-osgi-bundle-2.1.2.Final.
这个包存在于weld-se但不在 OSGi 包中。我怎么解决这个问题?
我正在尝试使用 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) 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,但这是我不喜欢的。
我正在尝试将JSF应用程序迁移到CDI。我已作出以下更改:
但是,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导致此错误?
开发环境:
我们有一个项目,由PMD检查是否违反了未使用的私人方法.我们的问题是我们不知道是否可以忽略带有注释的私有方法@PostConstruct.
该规则定义如下:
<rule ref="rulesets/java/unusedcode.xml/UnusedPrivateMethod"/>
Run Code Online (Sandbox Code Playgroud)
我的目标是定义一次以忽略带注释的方法.我想阻止@SupressWarnings在每种方法上写作.
我有一个带有@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)
有人知道该怎么做吗?如果有一种无需使用反射来扫描每个字段的方法,我将不胜感激。
提前致谢。
我正在寻找一种以编程方式加载给定拦截器的方法。
我已经看到了一种为给定 bean 动态设置拦截器绑定的方法,但是该绑定的拦截器必须在 beans.xml 中定义。我知道我可以使用@Interceptors注释,但这样我就被绑定到一个特定的实现。
有没有办法加载拦截器(可能通过 CDI 扩展)?
或者一种让拦截器默认启用而无需声明的方法<interceptors></interceptors>?
我正在使用 Weld-1.1.24
我已经多次看到 JAXRS 资源的几种配置方式。
我的意思是,有时我看到它们被注释为@Singleton, @Stateless, @ApplicationScoped, @RequestScoped, 甚至没有任何注释或同时使用它们。
javax.enterprise.context.RequestScopedjavax.enterprise.context.ApplicationScopedjavax.ejb.Statelessjavax.ejb.Singletonjavax.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)
我将如何进行?