Бин @Singleton для чтения значений из ejb-jar.xml - PullRequest
0 голосов
/ 14 ноября 2011

У меня есть ConfigParameter SLSB, который считывает значения конфигурации из файла ejb-jar.xml.

Этот класс имеет только закрытые поля и для каждого поля соответствующий метод получения. В моем приложении у меня есть много других EJB, которые используют экземпляр ConfigParameter для чтения значений конфигурации.

Теперь я подумал, что было бы неплохо сделать ConfigParameter @Singleton, так как его состояние является общим для всего приложения.

Но в ejb-jar.xml я могу установить session-type только на Stateful или Stateless. Файл выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0">
  <enterprise-beans>    
    <session>
      <ejb-name>ConfigParameter</ejb-name>
      <ejb-class>myapp.util.ConfigParameter</ejb-class>      
      <session-type>Stateless</session-type> <!-- make this a Singleton -->
      <env-entry>
        <env-entry-name>adminRoleName</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>admin</env-entry-value>
      </env-entry>
    </session>
  </enterprise-beans>
</ejb-jar>

Мои вопросы:

  1. Это хорошая идея сделать этот боб одиночным?
  2. Если да, как я могу этого достичь?
  3. Для понимания: почему не разрешено устанавливать session-type на Singleton?

Ответы [ 2 ]

3 голосов
/ 14 ноября 2011

Вы используете EJB 3.0.Синглтон EJB были введены в EJB 3.1.Если вы хотите определить его в ejb-jar.xml, вы должны определить соответствующую версию (обратите внимание, что атрибут версия и расположение XSD изменено на 3.1 )

<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" 
    version="3.1">

Или просто используйте @Singleton аннотацию для самого класса EJB.

И да - я бы определенно сказал, что уместно для обозначения бина конфигурации всего приложения как Singleton.

0 голосов
/ 19 ноября 2011

Хотя Singleton EJB - хороший вариант, я хотел бы предложить еще одну идею для рассмотрения.В зависимости от того, сколько значений вам нужно и где они используются, это может быть лучшим или не лучшим подходом.

Поскольку ваш ConfigParameter Singleton EJB - это просто POJO, который получает свои значения из JNDI через @Resource аннотация, вы можете использовать вместо этого записи среды модуля или приложения (java:module, java:app).Это может устранить необходимость в этом дополнительном классе EJB;вместо этого вы можете просто использовать аннотацию @Resource в каждом из EJB-компонентов, которым требуются значения.Чтобы сделать это, просто используйте аннотацию @Resource в EJB / веб-компоненте, которому требуется значение, используя имя с префиксом либо java:module, либо java:app: @Resource(name="java:app...").

...