2009-05-13 2 views
5

У меня возникли проблемы с доступом к сеансовому компоненту с состоянием (SFSB) из клиента приложения. Я использую JBoss 5.0.1.GA. Клиент приложения и EJB оба упакованы в EAR, который развертывается, и у меня есть другие клиенты приложений, которые работают без проблем. До сих пор я использовал сессионные компоненты без состояния (SLSB), но, насколько я понимаю, различия между SLSB и SFSB не должны влиять на то, как они могут быть доступны из приложения-клиента.EJB 3: Доступ к сеансовому компоненту с состоянием из приложения-клиента

Структура классов/интерфейсов:

@Local public interface A {...} 

@Stateless public class ABean implements A {...} 

@Remote public interface B {...} 

@Stateful public class BBean implements B { 
    @EJB private A anInstanceOfA; 

    @PostConstruct private void init() { 
     this.anInstanceOfA.someMethod(); 
    } 
} 

Клиентское приложение запускается через «AppClient-пусковой установки», как описано в "How to use an application client in JBoss 5". Выполнение поиска «BBean» работает нормально до тех пор, пока someMethod() на (локальном) ABean не будет вызван во время выполнения init(). Во время этого вызова контейнер выдает InvalidStateException («Локальный вызов: контекст безопасности имеет значение null») (в качестве основной причины). Когда я изменяю фазу с состоянием в факторе без состояния, все работает нормально (за исключением, конечно, того, что государство не сохраняется). Интересно, что я могу использовать точно такую ​​же SFSB из веб-приложения (в JSF-управляемом компоненте) просто отлично.

Я делаю что-то неправильно? Как я должен использовать SFSB от клиента приложения?

Я пока не нашел ничего полезного в этой конкретной проблеме. Исключение упоминается в аналогичном контексте в [#JBAS-4317] Security Context over the invocation, но, учитывая, что оно отмечено как сделанное и зафиксировано в JBoss 5.0.0.Beta3, похоже, это не проблема.

ответ

1

Несмотря на то, что я все же хотел бы знать, почему моя первоначальная установка работает отлично для сеансные но не сохраняющих состояние сессионных компонентов, здесь есть решение, которое я нашел:

Веб-приложение, которое также упакованы в EAR выполняется аутентификация через JAAS. Для этого я настроил домен безопасности в JBoss логин-config.xml, который выглядит следующим образом:

<application-policy name="My-SD"> 
    <authentication> 
     <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required"> 
      <module-option name="unauthenticatedIdentity">guest</module-option> 
      <module-option name="dsJndiName">java:/myDS</module-option> 
      <module-option name="principalsQuery">SELECT PASSWORD FROM LOGIN WHERE LOGIN = ? AND STATUS > 0</module-option> 
      <module-option name="rolesQuery">SELECT ROLE, 'Roles' FROM USER_ROLE WHERE LOGIN = ?</module-option> 
     </login-module> 
    </authentication> 
</application-policy> 

Я использовал этот домен безопасности в JBoss-web.xml веб-приложения, а также в EJB-проект jboss.xml, хотя я фактически использую его только в веб-приложении (EJB доступны без аутентификации).

Чтобы решить проблему с доступом к SFSB, мне просто пришлось удалить свой домен безопасности из jboss.xml в EJB-проекте. Это делает JBoss использующим домен безопасности по умолчанию, который, кажется, делает правильные вещи, и мой клиент приложения, наконец, может получить доступ и использовать SFSB.

0

Причина может быть в разделе EJB 3.0 Core Specification, раздел 12.4. Там сказано:

Методы перехватчика обратного вызова обратного вызова вызываются в неопределенном контексте транзакций и безопасности.

НТН,
- мартин

+1

Интересная информация. Хотя, я не уверен, как это объясняет поведение, тем более, что он «работает» в факторе без состояния, и проблема возникает только тогда, когда я использовал свой собственный домен безопасности. Во всяком случае, поскольку я больше не имею никакого отношения к проекту и с тех пор не развивал разработки Java EE, я не очень мотивирован, чтобы узнать, как этот материал действительно работает. Спасибо, в любом случае! –

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