Каковы правильные значения параметров политики безопасности, позволяющие одновременно работать RMI и JPA / Hibernate - PullRequest
0 голосов
/ 27 мая 2011

Я работаю над приложением, которое требует использования как JPA / Hibernate, так и RMI. Поскольку RMI требует использования Политики безопасности, чтобы удостовериться, что доступ к сети назначен правильно, я также теперь должен беспокоиться о разрешениях для папки.

Я искал в Интернете (и здесь, на SO) пару дней, пытаясь найти решение этой проблемы. В основном проблема в том, что для работы JPA / Hibernate мне нужно поместить файл persistence.xml в каталог META-INF, а каталог META-INF должен находиться в каталоге src моего проекта (что не делает толку мне тоже но это работает). Так что макет проекта в основном:

 org.project.root
 |
 |>src
 |  |
 |  |>org.project.package
 |  |
 |  |>META-INF
 |       |
 |       |>persistence.xml
 |
 |>config
 |
 |>database
 |
 |>logs

Мой файл политики безопасности. Я пытался предоставить доступ на чтение к папке ${user.dir}${/}src${/}META-INF${/}-, однако при попытке запустить приложение выдает ошибку No Persistence provider for EntityManager named DERBY_ACPSTORE_CREATE. Мой файл persistence.xml, однако, содержит это, и он работает, когда закомментируйте все RMI и перестанете читать политику безопасности. Поэтому мой вопрос заключается в том, как мне получить файл политики безопасности, позволяющий мне читать файл persistence.xml?

ОБНОВЛЕНИЕ 1

Используя предложенную информацию о пути от @Vineet Reynolds, я могу увидеть путь к файлу, используя:

 File f = new File("META-INF/persistence.xml");
 System.out.println(f.getAbsolutePath());

Однако, я все еще получаю эту ошибку, когда пытаюсь создать базу данных.

 javax.persistence.PersistenceException: No Persistence provider for EntityManager named DERBY_ACPSTORE_CREATE
 at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
      at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
      at org.myproject.data.DBInit.dbInit(DBInit.java:29)
      at org.myproject.ACPStoreMainService.main(ACPStoreMainService.java:91)

Мой файл persistence.xml, как я уже сказал, работал нормально, прежде чем я начал использовать политику безопасности, поэтому я знаю, что модуль постоянства "DERBY_ACPSTORE_CREATE" присутствует и исправен.

Обновление 2

Хотя я не уверен, что это хорошо, так как это работало, когда я не использую Политику безопасности, вот мое содержание persistence.xml:

 <?xml version="1.0" encoding="UTF-8"?>
 <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence     http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
      <persistence-unit name="DERBY_ACPSTORE_CREATE">
           <provider>org.hibernate.ejb.HibernatePersistence</provider
           <class>org.myproject.data.MessageHistory</class>
           <properties>
                <property name="hibernate.connection.driver_class" 
           value="org.apache.derby.jdbc.EmbeddedDriver" />
                <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect" />
                <property name="hibernate.connection.url" value="jdbc:derby:database/acpstore;create=true" />
                <property name="hibernate.show_sql" value="true" />
                <property name="hibernate.format_sql" value="true" />
                <property name="use_sql_comments" value="true" />
                <property name="hibernate.hbm2ddl.auto" value="create" />
                <property name="hibernate.connection.username" value="user" />
                <property name="hibernate.connection.password" value="password" />
           </properties>
      </persistence-unit>
 </persistence>

ОБНОВЛЕНИЕ 3

Как я уже упоминал в комментарии к ответу Vineet Reynolds ниже, я протестировал файл persistence.xml без защиты и теперь он работает. Затем, когда я восстанавливаю политику безопасности, я снова получаю ошибки. Ниже приведено содержание моей политики безопасности и порядок ее создания в приложении:

 grant {
      permission java.lang.RuntimePermission "shutdownHooks";
      permission java.lang.RuntimePermission "readFileDescriptor";
      permission java.lang.RuntimePermission "writeFileDescriptor";
      permission java.util.PropertyPermission "user.dir", "read";
      permission java.net.SocketPermission "172.10.10.21:1024-65535", "connect, accept, resolve";
      permission java.net.SocketPermission "172.10.10.21:1-1023", "connect,resolve";
      permission java.io.FilePermission "${user.dir}${/}META-INF${/}-", "read";
      permission java.io.FilePermission "${user.dir}${/}config${/}-", "read, write, delete";
      permission java.io.FilePermission "${user.dir}${/}database${/}-", "read, write, delete";
 };

И это то, что происходит в моем приложении для установки менеджера безопасности

 if(System.getSecurityManager() == null)
 {
      System.setSecurityManager(new RMISecurityManager());
 }

ОБНОВЛЕНИЕ 4

Я нашел сообщение, которое не заметил до прихода из log4j. Сообщение

 [main] INFO org.hibernate.ejb.Ejb3Configuration  - Could not find any META-INF/persistence.xml file in the classpath

что странно для меня. Поэтому я перечислил каталоги в classpath и нашел org.project.root\bin, но не org.project.root. Теперь я знаю, что META-INF во время выполнения расположен как org.project.root\META-INF, и что путь к классу должен указывать на org.project.root, чтобы JPA и hibernate могли получить доступ к файлам persistence.xml. Так может ли быть так, что мне нужно как-то изменить путь к классу, чтобы он соответствовал этому?

Ответы [ 2 ]

1 голос
/ 27 мая 2011

Исходный вопрос не указывает, присутствует ли каталог src в среде выполнения или нет. Я бы предположил, что он отсутствует в среде выполнения по причинам, указанным ниже.

Каталог src - это артефакт, который обычно требуется во время разработки для представления исходного каталога. Во время выполнения этот каталог обычно отсутствует в структуре каталогов (файла JAR).

Возможно, вам лучше указать разрешение на предоставление доступа для чтения:

${user.dir}${/}META-INF${/}-

Edit:

На основании того факта, что исключения исключений SecurityException не выданы, а исключение PersistenceExcpetion выдает, что содержимое файла persistence.xml может быть недопустимым. На следующие вопросы в StackOverflow можно ссылаться, но разрешение не обязательно должно быть таким же, как показано в ответах.

  1. javax.persistence.PersistenceException: Отсутствует поставщик сохраняемости для EntityManager с именем customerManager
  2. Отсутствует поставщик сохраняемости для EntityManager с именем…
0 голосов
/ 30 мая 2011

Я поставлю Vineet на голосование за то, что помог мне узнать, где заканчивается папка META-INF, однако я наконец-то выяснил, в чем заключается моя проблема с разрешениями.

java.io.FilePermission является иерархическим,Это означает, что вы должны предоставить доступ «для чтения» к папкам более высокого уровня, прежде чем вы сможете предоставить его нижним каталогам.

По сути, в моем файле политики безопасности я должен был сначала сделать permission java.io.FilePermission "${user.dir}${/}-", "read";, прежде чем ввести permission java.io.FilePermission "${user.dir}${/}META-INF${/}-", "read";

...