gpt4 book ai didi

java - 使用@RequestScoped CDI bean的@Remote EJB

转载 作者:行者123 更新时间:2023-12-01 10:51:53 25 4
gpt4 key购买 nike

我有一个应用程序,其中有 @Remote @Singleton注入(inject) @RequestScoped 的 EJB CDI 制作的实体管理器。同一服务器 (wildfly 9)/JVM 上的另一个应用程序将使用此 EJB 来获取从实体管理器获取的结果。

EJB 的第一次调用将返回预期结果。它生成实体管理器,获取数据并在调用返回时再次处理实体管理器。由于实体管理器已关闭,该 EJB 的每次后续调用都会引发错误。不会为新的实体管理器进行生产/处置。

这是预期的行为吗?我的代码有错误吗?

<小时/>
IFrameworkResourceManager framework = _applicationContext.getFrameworkResourceManager();
final User resolvedUser = framework.resolveUser(username, domain);
// ...
final Rights resolvedRights = framework.resolveRights(resolvedUser.getGuid(), applicationId);
// ...

这段代码在 CDI 生成器中执行,一旦为用户创建新的 http session ,该生成器就会再次执行。如果我调用getFramworkResourceManager,什么都不会改变。在调用resolveRights之前再次.

<小时/>
public IFrameworkResourceManager getFrameworkResourceManager() {
return IFrameworkResourceManager frm = (IFrameworkResourceManager) ctx
.lookup("java:global/WebFramework/WebFrameworkImpl!my.package.IWebFramework");
}

我使用直接 JNDI 查找还是 @EJB 并不重要。注入(inject)。返回的实例报告 ( toString() ) 为 Proxy for remote EJB StatelessEJBLocator for "/WebFramework/WebFrameworkImpl", view is interface my.package.IWebFramework, affinity is None

<小时/>
@LocalBean
@Singleton
public class WebFrameworkImpl implements IWebFramework, Serializable {
@Inject
private EntityManager _entityManager;

@Override
public User resolveUser(String username, String domain) {
System.out.println(_entityManager + " || " + _entityManager.isOpen());
// execute query using QueryDSL and the injected entityManager
}

@Override
public Rights resolveRights(String guidUser, int applicationId) {
System.out.println(_entityManager + " || " + _entityManager.isOpen());
// execute query using QueryDSL and the injected entityManager
}
}

@Remote
public interface IWebFramework extends IFrameworkResourceManager {
// some methods...
}

public interface IFrameworkResourceManager {
public User resolveUser(String username, String domain);
public Rights resolveRights(String guidUser, int applicationId);
}

resolveUser 的系统输出:org.hibernate.jpa.internal.EntityManagerImpl@379e882b || true

resolveRights 的系统输出:org.hibernate.jpa.internal.EntityManagerImpl@379e882b || false

<小时/>

编辑 20.11.2015 13:43:持久性单元的类型为 RESOURCE_LOCAL 。另外所有@ResourceScoped bean 类受到影响。 @PostConstruct@PreDestroy仅在第一次 EJB 调用时调用。每个后续调用都使用资源范围 bean 的前一个实例,这是不正确的。

编辑 2015 年 11 月 20 日 13:55:如果从提供 EJB 的同一应用程序中调用 EJB,一切都会按预期运行。此行为仅在来自其他应用程序的调用时出现。

编辑2015年11月20日15:24:JBoss AS 7.1.3.Final、Wildfly 9.0.0.Final和Wildfly 10.0.0.CR4均受到影响。但根据 CDI 规范(1.0 至 1.2)第 6.7.4 章,这应该可行。我已填写错误报告 (WFLY-5716)。

最佳答案

当使用RESOURCE_LOCAL时,您应该从EntityManagerFacgtory创建EntityManager并自行处理它,例如:

private EntityManagerFactory factory = Persistence.createEntityManagerFactory("unit-name");

public void someMethod(){

EntityManager em = emf.createEntityManager();
EntityTransaction tx = null;
try {
tx = em.getTransaction();
tx.begin();

// do some work

tx.commit();
}
catch (RuntimeException e) {
if ( tx != null && tx.isActive() )
tx.rollback();
throw e; // or display error message
}
finally {
em.close();
}
}

关于java - 使用@RequestScoped CDI bean的@Remote EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33826720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com