Файлы конфигурации приложения для веб-служб Glassfish/Java EE 5

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

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

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

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

Мне нужен мой подход и для работы в WebSphere Application Server. Спасибо!


person Community    schedule 07.07.2009    source источник
comment
Хм. Я очень сомневаюсь в необходимости тега .net в этом вопросе.   -  person serhio    schedule 30.11.2009


Ответы (5)


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

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

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

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

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

person German    schedule 07.11.2011
comment
Я не понимаю, почему вы говорите, что эти системные свойства - быстрое и грязное решение, а не для производства. Из того, что я могу сказать, я думаю, что они имеют свое место помимо хранения базы данных, в редких случаях, а также в производстве. - person Emmanuel Touzery; 05.06.2013
comment
Для некоторых свойств это может быть нормально, но они не предназначены для замены полной конфигурации приложения. Одной из проблем является разделение проблем, поскольку они доступны из любого места, конфигурации, предназначенные для использования только одним уровнем, могут быть неправильно использованы и в других местах. Другой проблемой является безопасность, я не уверен, но я думаю, что они являются общими для всех приложений, развернутых на сервере, потому что они работают в одной и той же JVM. Что произойдет, если развернуто вредоносное приложение и изменит вашу конфигурацию, вызвав System.setProperty(myProperty, fakeValue)? это изменяемые суперглобальные значения. - person German; 06.06.2013
comment
Это лучший ответ для нашей ситуации, если мы собираемся пойти по этому пути. Мы используем систему хранения конфигурации, но нам нужна среда, установленная между разными серверами Glassfish. Мы хотим, чтобы один и тот же военный файл работал на любом из наших серверов Glassfish, поэтому нашей целью является исключение текущей среды (локальной, разработки, производства и т. д.) из войны, чтобы мы знали, какую конфигурацию получить из хранилища конфигурации. В качестве альтернативы мы думали о сохранении в хранилище конфигурации и проверке среды на основе сервера и по умолчанию на локальной. Любые другие идеи также будут оценены. - person adprocas; 03.05.2017

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

Лучше всего:

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

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

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

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

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

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

person Craig Ringer    schedule 04.11.2011
comment
Вы можете использовать MXbean для хранения настроек (карта свойства = значение), чтобы вы могли читать/обновлять настройки во время выполнения с помощью таких инструментов, как jconsole/visualvm. - person gpilotino; 11.02.2013

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

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

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

person Community    schedule 28.09.2009

Лучшее решение, которое я нашел до сих пор, это "EAC4J (Внешняя конфигурация приложения для Java)". Я успешно использовал во многих проектах.

person szarza    schedule 24.05.2012

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

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

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

person Ben    schedule 10.03.2014