2010-11-30 2 views
6

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

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

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

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

Что лучший способ решить эту проблему? Я уже использую JNDI как средство экстернализации конфигурации, поэтому я не могу экстернализировать мою внешнюю конфигурацию! В то же время я совершенно не согласен с идеей создания двух отдельных конфигурационных файлов Spring. ПОМОГИТЕ!!!

ответ

7

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

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

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

Легко!

1

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

Используйте держатель места весны. См

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

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

+0

Вы хотите использовать это значение из заполнителя свойства как имя jndi? Или вообще пропустить JNDI? – HDave 2010-11-30 04:47:11

+1

@hdave, настройте jndi-name для be = "{jndi.name}", где jndi.name - это свойство в файле сборки, который генерируется вашим процессом сборки. Кажется, вы решили проблему, но эта техника определенно будет полезна для вас в конечном итоге. – hvgotcodes 2010-11-30 14:11:49

4

После некоторых экспериментов я понял, что могу просто заставить 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> 

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

Update:

Это работает, если вы поместите файл Пристань-env.xml внутри ВОЙНЫ ... но по какой-то причине, один вы перемещаете эту конфигурацию за пределами WAR и в файл контекста фрагмента в каталог Jetty в «контексты», то он бросает исключение:

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