Tomcat против Jetty JNDI Поиск - PullRequest
       38

Tomcat против Jetty JNDI Поиск

6 голосов
/ 30 ноября 2010

Я использую Spring для настройки своего Java Web App и в своей конфигурации Spring я получаю источник данных через JNDI для Jetty следующим образом:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myDataSource" />

, но это не будетКот.С Tomcat я должен сделать это:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/myDataSource" />

Какой лучший способ решить эту проблему?Я уже использую JNDI для вывода конфигурации из-под контроля, поэтому я не могу вынести свою внешнюю конфигурацию!В то же время я абсолютно не хочу иметь два отдельных конфигурационных файла Spring.HELP !!!

Ответы [ 3 ]

7 голосов
/ 15 декабря 2010

Я нашел ответ здесь , но я подумал, что это немного сложно, но это дало мне идею использовать очень крутой класс ServerDetector , который нашел блогер.

Как только я смог динамически определить, на каком типе сервера я работаю, я смог использовать язык выражений Spring для выполнения остальной части работы:

<jee:jndi-lookup id="myAppDataSource" 
    jndi-name="#{ (AppServerType == 'Jetty' ? 'jdbc/' : 'java:comp/env/jdbc/') + 
                  'myAppDataSource' }" />

Легко!

5 голосов
/ 30 ноября 2010

После некоторых экспериментов я понял, что могу заставить Jetty использовать тот же путь JNDI, что и Tomcat. Следующий фрагмент из моего jetty-env.xml файла:

 <New id="myDataSource" class="org.mortbay.jetty.plus.naming.Resource">
  <!-- We MUST specify the entire JNDI path here to force compliance with the Tomcat/J2EE convention -->
  <Arg>java:comp/env/jdbc/myDataSource</Arg>
  <Arg>
   <New class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean">
    <Set name="uniqueResourceName">sbeDatabase</Set>
                 ...............
   </New>
  </Arg>
 </New>

Не уверен, что это идеально, но это работает.

Обновление

Это работает, если вы поместите свой файл jetty-env.xml в WAR ... но по какой-то причине, если вы переместите эту конфигурацию за пределы WAR и в файл фрагмента контекста в каталоге "contextx" Jetty, он выдаст исключение:

Проверьте это: http://jira.codehaus.org/browse/JETTY-273

1 голос
/ 30 ноября 2010

Самый чистый способ сделать это - настроить свою конфигурацию. ;)

Используйте заполнитель свойства Spring. См

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-placeholderconfigurer

Основная идея состоит в том, что вы просто помещаете заполнитель в конфигурацию Spring со свойством, а затем он читает соответствующее свойство из файла свойств. Вы генерируете файл свойств в процессе сборки. Я видел, что это было сделано, когда инструмент сборки (ant) считывает переменную среды, а затем создает файл свойств, соответствующий среде, на основе файла скелета, заполненного токенами.

...