我有一个处理登录的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
注释,就不会发生任何注入!在这种情况下,进入authenticate()
方法时,EntityManager实例为null。另一个有趣的注意事项是,使用单独的有状态会话bean,只有在我将其设置为静态时,才会注入该类中的Logger实例。如果我有它非静态,它不会注入。这对于记录器来说很好,但对于像这样的无状态会话bean,我显然不能拥有这些组件的静态成员变量。
我很困惑,因为这个身份验证器正是它在Seam预订示例中的样子:一个无状态会话bean,它注入了一个私有成员变量。
有什么想法吗?
答案 0 :(得分:4)
我很好奇:
但是,只要我添加@Stateless注释,就不会发生任何注入!
所以我希望您的身份验证器界面标记为,@ javax.ejb.Local或@ javax.ejb.Remote。如果没有,那么你的无国籍人将无法按预期工作。
当您拥有@Stateless会话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>
如果可能的话,请看看Seam Security with Dan Allen,JavaOne,Seam in Action book的作者。
的问候,