2009-07-07 3 views
11

Я пытаюсь написать несколько простых веб-сервисов Java, чтобы мы могли вызвать Java-код из .NET. До сих пор я получил доказательство концепции, работающей под Glassfish. Довольно просто, когда IDE выполняет всю работу.Файлы конфигурации приложения для веб-служб Glassfish/Java EE 5

Теперь я действительно забочусь о вещах на Java, что должно быть действительно простым. Например, я хочу экрнализировать мою конфигурацию, чтобы я мог изменять такие вещи, как строки подключения/имена пользователей/переменные приложения/etc без повторной компиляции.

В .NET, вы бы просто вставить некоторые строки в файле web.config в корневом каталоге веб-сайта и использование: ConfigurationManager.AppSettings["whateverIwant"];

я могу получить java.util.Properties делать то, что я хочу (от автономный клиент), но я не могу понять, куда поместить файл .properties и как получить путь к нему из веб-службы.

Мне нужен мой подход к работе в WebSphere Application Server. Благодаря!

+0

hmm. Я действительно сомневаюсь в необходимости тега «.net» в этом вопросе. – serhio

+0

Я тоже. Удалены. –

ответ

3

Конфигурация приложения, к сожалению, зависит от контейнера. В общем, вы получаете доступ к своей конфигурации через JNDI. Подход, который я недавно использовал, следующий:

  • Сделайте базу данных доступной для вашего приложения (через JNDI, используйте мастер базы данных Glassfish). Это часть зависит от контейнера.
  • Создайте объект entity, который десериализует ваши настройки из базы данных. Простое решение здесь иметь что-то вроде этого:
 
@Entity 
public class Setting { 
    @Id 
    private String name; 
    private String value; 
    ... 
} 

Тогда это вопрос делать em.find(Setting.class, "whateveriwant").getValue(). Кроме того, вы можете создать единый бин объекта со всеми настройками в качестве атрибутов. В любом случае, этот подход уменьшает зависимость контейнера до минимума.

5

Увы, Java EE имеет гигантское отверстие в голове, когда дело доходит до конфигурации приложения.

Лучше всего либо:

  • использования JNDI для хранения конфигурации в среде сервера приложений. Это трудно сделать переносимым, болезненным и абсолютным кошмаром для пользователя, чтобы выполнить любую конфигурацию. Конфигурационный интерфейс зависит от того, какой сервер и версия приложения используется, и может быть утилитой командной строки, специфичной для этого сервера приложений.

  • Используйте API настроек, чтобы сохранить конфигурацию и создать собственный пользовательский интерфейс для его редактирования. Это нормально ... кроме того, что вы не можете контролировать, когда ваши настройки очищены и повторно включены. Некоторые серверы приложений будут делать это, когда ваше приложение будет повторно развернуто, чего вы, вероятно, не захотите.

В целом, ситуация абсолютно воняет. Нет чистого и разумного способа для приложения-сервера предоставить приложение с простой картой свойств и пользовательским интерфейсом, чтобы редактировать его с помощью средств администрирования сервера приложений.

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

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

Смотри также: Storing and editing configuration for Java EE applications

+0

Вы можете использовать MXbean для сохранения настроек (Map of property = value), чтобы вы могли читать/обновлять настройки во время выполнения с помощью таких инструментов, как jconsole/visualvm – gpilotino

7

Как уже упоминалось, это в значительной степени зависит от контейнера, но почти всегда динамические конфигурации хранятся в базе данных вместо XML или .properties файлов.

Как я вижу, это как доказательство концепции, вот быстрое и грязное решение: (не делайте этого для производственного кода) используйте Свойства системы. Недостаток: при каждом изменении вам нужно перезагрузить контейнер, но вам не нужно перекомпилировать приложение.

Чтобы использовать свойства системы в Glassfish, вы можете перейти в раздел «Конфигурация -> Свойства системы» и добавить туда свойства. Затем изнутри приложения просто позвоните

String myValue = System.getProperty("myProperty"); 

Чтобы получить стоимость. Все java-приложения поддерживают эти свойства, но я не знаю, как их настроить в Websphere.

+0

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

+2

Для нескольких свойств это может быть нормально, но они не предназначены для замены полной конфигурации приложения. Одной из проблем является разделение проблем, поскольку они доступны из любого места, конфигурации, предназначенные для использования только одним слоем, могут быть неправильно использованы и в других местах. Другая проблема - это безопасность, я не уверен, но я думаю, что они распределены между всеми приложениями, развернутыми на сервере, потому что они работают в одной JVM. Что произойдет, если вредоносное приложение развернуто и изменит вашу конфигурацию, вызвав System.setProperty («myProperty», «fakeValue»)? они изменяют супер глобальные ценности. – German

+0

Это лучший ответ для нашей ситуации, если мы собираемся пройти этот маршрут. Мы используем систему хранения конфигурации, но нам нужна среда, установленная между различными серверами из стекла. Мы хотим, чтобы один и тот же файл войны работал на любом из наших серверов из стекла, поэтому исключение текущей среды (локальная, разработка, производство и т. Д.) Из войны - наша цель, поэтому мы знаем, какую конфигурацию нужно получить из хранилища конфигурации. В качестве альтернативы мы думали о хранении в хранилище конфигов и проверке среды на основе сервера, а по умолчанию - на локальном. Любые другие идеи также будут оценены. – adpro

2

Поместите следующий код в методе contextInitialized в виде контекста сервлета:

ServletContext sc = sce.getServletContext(); 
Properties systemProps = System.getProperties();    
String path = sc.getRealPath("WEB-INF/application.properties"); 
systemProps.load(new FileInputStream(path)); 

Это считывает из application.properties с веб-INF папку вашего веб-приложения при запуске. Это потребует перезапуска при каждом изменении конфигураций, но, на мой взгляд, так и должно быть.

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