我有一个处理登录的 Seam 组件,名称为“authenticator”:
@Name("authenticator")
public class AuthenticatorAction implements Authenticator
{
@PersistenceContext
private EntityManager em;
@In(required=false)
@Out(required=false, scope = SESSION)
private User user;
public boolean authenticate(){ ... }
}
这工作得很好,Seam 注入了 EntityManager 实例。但是,一旦我添加@Stateless
注释,没有任何注入发生!在这种情况下,EntityManager 实例在进入时为 nullauthenticate()
方法。另一个有趣的注意事项是,对于我拥有的单独的有状态会话 bean,只有当我将其设为静态时,才会注入该类中的 Logger 实例。如果我有它非静态的,它不会被注入。这对于记录器来说很好,但是对于像这样的无状态会话 bean,我显然不能为这些组件提供静态成员变量。
我很困惑,因为这个验证器正是 Seam 预订示例中的样子:一个带有被注入的私有成员变量的无状态会话 bean。
有任何想法吗?
我好奇:
然而,一旦我添加@Stateless注释,没有任何注射发生!
So i hope您的身份验证器界面被标记与@javax.ejb.Local或@javax.ejb.Remote。如果没有,那么你的 Stateless 将无法按预期工作。
当你有一个@Stateless Session bean时,你必须激活一个Seam拦截器为了启用@In-jection。就像是
pureCharger-jar.jar
META-INF
ejb-jar.xml
persistence.xml
ejb-jar.xml如下所示
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0">
<interceptors>
<interceptor>
<interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
</interceptor>
</interceptors>
<assembly-descriptor>
<interceptor-binding>
<ejb-name>*</ejb-name>
<interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class>
</interceptor-binding>
</assembly-descriptor>
</ejb-jar>
如果可以的话,看一下Dan Allen 的接缝安全 http://www.jboss.org/events/javaone/javaoneVideo3.html,JavaOne 的《Seam in Action》一书的作者。
regards,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)