JBoss Seam:注入POJO的组件,但不是会话Bean

时间:2010-03-08 19:59:16

标签: java jsf jboss seam ejb

我有一个处理登录的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,它注入了一个私有成员变量。

有什么想法吗?

1 个答案:

答案 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的作者。

的问候,