2010-03-08 3 views
3

У меня есть компонент Seam, который обрабатывает логин, с именем «идентифицирующей»:JBoss Seam: компоненты, вводимые в POJOs, но не Сеансные

@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 имеет значение null при входе в метод authenticate(). Еще одно интересное замечание заключается в том, что с отдельным сеансовым компонентом состояния, который у меня есть, экземпляр Logger в этом классе вводится только в том случае, если я делаю его статическим. Если у меня он нестатический, он не вводится. То, что отлично подходит для регистратора, но для сессионных фанов без состояния, я, очевидно, не могу иметь статических переменных-членов для этих компонентов.

Я смущен, потому что этот аутентификатор точно такой же, как в примере бронирования Seam: сеансовый компонент без состояния с добавленной частной переменной-членом.

Любые идеи?

ответ

4

Мне любопытно:

Однако как только я добавить @Stateless аннотацию, ни один из инъекции не происходит!

Так я надеюсь ваш интерфейс Authenticator отмечен с @ javax.ejb.Local или @ javax.ejb.Remote. Если нет, значит, ваш Stateless не будет работать должным образом.

Если у вас есть @Stateless Session bean, , вы должны активировать перехватчик Seam, чтобы включить @ In-jection. Что-то вроде

pureCharger-jar.jar 
    META-INF 
     ejb-jar.xml 
     persistence.xml 

-jar.xml EJB показано следующим

<?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, автор пластах в книге действий.

С уважением,

+0

Привет Артур, Да, интерфейс аутентификации отмечен @LOCAL: импорта javax.ejb.Local; @Local публичный интерфейс Аутентификатор { boolean authenticate(); } – purecharger

+0

Так оно и было, еще раз спасибо Артур – purecharger

Смежные вопросы