2009-12-26 1 views
4

У меня есть приложение EE EE5 EEB3 для Java. Я разрабатываю с использованием NetBeans 6.7 и GlassFish 2.x Мне нужен файл конфигурации (* .xsl, * .xml), который является специфичным для развертывания/клиента.Как загрузить файлы в сессионный компонент

Мои вопросы:

1), где я кладу файлы, которые являются внешними по отношению к файлу уха?

2) Как загрузить файлы в сессионный компонент? можно ли использовать инъекцию?

Мне удалось ввести @Resource для имени файла, используя ejb-jar.xml.

Большое спасибо заранее. G.

ответ

5

Я думаю, это не то, что вы ожидаете, но правильный ответ заключается в том, что вы не должны этого делать! Согласно EJB specifications и более точно в программировании Ограничения:

Предприятия компоненты не должны использовать java.io пакет, чтобы попытаться получить доступ к файлам и каталогам в файловой системе.

И это утверждение следует этим объяснением:

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

Причины этого утверждения являются:

  1. Доступ к файловой системе не является транзакционной и скомпрометирует компонент distributability.
  2. Доступ к файловой системе из EJB может поставить под угрозу ее развертываемость (ресурс не находится под управлением контейнера EJB, и EJB нельзя легко перемещать в кластере).
  3. Доступ к файловой системе является потенциальным ядром безопасности.

Теперь, когда вы знаете это, если вы все еще хотите, чтобы делать то, что вы имели в виду, и если ваш EJB контейнер не ограничивает с помощью классов из java.io пакета, то я бы поставил только для чтения файлов на classpath, предпочтительно в JAR, и получить доступ к нему с использованием методов getResource() или getResourceAsStream()java.lang.Class. Но на самом деле вы должны помнить о спецификации, она поможет вам создавать портативные приложения.

+0

Спасибо, паскаль. Можете ли вы предложить альтернативный способ решения этого требования? большое спасибо. G. – Gadi

+0

Мы дали вам уже намеки на этой странице (свойства JDBC, JNDI), но я позволю ewernli ответить на этот вопрос, как вы приняли его ответ. –

+0

Hi Pascal. Мне нужно быть более конкретным :). Мне нужно загрузить файл xsl для перевода xml, отправленного через веб-сервис или http-сообщение. каждому клиенту потребуется, чтобы файл был немного другим. Я использовал JNDI и @Resource-инъекцию, но я не вижу, как файл xsl может быть загружен таким образом. большое спасибо. G. – Gadi

1

См. Этот вопрос: Process files in Java EE.

Спецификация запрещает доступ к файлу с помощью java.io, он не запрещает доступ к файлам в целом.

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

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

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

2

Если вы можете собрать один EAR для целевого развертывания (возможно, maven profile может помочь в этой области), то вы можете загрузить его как ресурс.

Другой вариант - посмотреть на J2EE Application Deployment Specification (JSR-88), чтобы иметь один EAR с N План развертывания для каждой среды.

Вы также можете решить сохранить файл в файловой системе (хотя это запрещено). Если вы хотите, чтобы путь находился в ejb.xml, вам нужно снова собрать или развернуть EAR по-разному - тогда нет большого выигрыша. Другой вариант - использовать Glassfish Custom JNDI Resource, чтобы иметь возможность настроить путь прямо из консоли администратора. Ваше приложение. может загрузить файл в соответствии с заданным контуром.

+0

Благодарим вас за ответ. Если я возьму вышеприведенный совет и не использую файловую систему, вы можете объяснить, что будет альтернативной стратегией? Могу ли я упаковать файлы в lib и использовать его как внешнюю библиотеку из основной эры? таким образом я могу расфасовывать lib только за развертывание. большое спасибо. G. – Gadi

+0

Не знаете, что именно вы имеете в виду, но обычно, если вы упаковываете свои конкретные файлы клиента в .jar и помещаете .jar в .ear, тогда вы должны иметь возможность загружать файл как ресурс. – ewernli

+0

привет, да, это то, что я имел в виду. Я предполагаю, что у меня может быть файл jar по умолчанию, который имеет файлы по умолчанию, а затем для каждого клиента я могу заменить только эту банку в ухе? большое спасибо. Г. – Gadi