在Java 8 lambda中使用时,EJB调用缺少调用方主体

在Java 8 lambda中使用时,EJB调用缺少调用方主体,java,hibernate,jpa,lambda,wildfly,Java,Hibernate,Jpa,Lambda,Wildfly,我试图从lambda表达式内部调用bean API,但它的SessionContext不包含正确的调用主体。它是匿名的 甚至这个API上的拦截器也有相同的行为 只有在从lambda内部调用bean时才会发生。找不到此主题的任何其他问题 我使用的是WildFly 10.0.0,Hibernate Core 5.0.10 JPA 2.1,在您的案例中运行在lambda中,这可能意味着代码在不同的线程中执行,并且因为安全上下文通常绑定到线程,所以当您在新线程中运行异步任务时,它不会从父线程继承安全上下

我试图从lambda表达式内部调用bean API,但它的SessionContext不包含正确的调用主体。它是匿名的

甚至这个API上的拦截器也有相同的行为

只有在从lambda内部调用bean时才会发生。找不到此主题的任何其他问题


我使用的是WildFly 10.0.0,Hibernate Core 5.0.10 JPA 2.1,在您的案例中运行在lambda中,这可能意味着代码在不同的线程中执行,并且因为安全上下文通常绑定到线程,所以当您在新线程中运行异步任务时,它不会从父线程继承安全上下文。这意味着新线程必须以某种方式重新进行身份验证。对于WildFly 10,如果将此项添加到lambda中,则此项应能正常工作:

org.jboss.security.client.SecurityClient client = SecurityClientFactory.getSecurityClient();
client.setSimple("USERNAME", "PASSWORD");
client.login();
try {
   bean.call();
} finally {
   client.logout();
}
如果您使用Elytron切换到WildFly 11,将提供:

final SecurityIdentity identity = org.wildfly.security.auth.server.SecurityDomain.getCurrent().getCurrentSecurityIdentity();
identity.runAs(() -> { the-code-you-want-to-run-with-this-identity } );

显示位代码。lambda看起来怎么样?它是平行流吗。?在那之前,lambda执行了你有权利的委托人。i、 e.将@RoleAllowed注释添加到方法中,并查看它是否可以在调用lambda之前执行。