2011-05-27 70 views
0

我正在處理需要同時使用JPA/Hibernate和RMI的應用程序。由於RMI需要使用安全策略來確保正確分配對網絡的訪問權限,因此我現在不得不擔心文件夾權限。什麼是正確的安全策略值設置,以允許RMI和JPA /休眠同時工作

我一直在網上尋找(和在這裏)幾天,現在試圖找到解決這個問題。基本上問題是,對於JPA /休眠工作,我必須將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雷諾茲我能夠該文件的路徑使用的是看建議的路徑信息:

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> 

UPDATE 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()); 
} 

UPDATE 4

我發現了一條消息,我沒有注意到來自log4j之前。該消息是

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

這對我來說似乎很奇怪。所以我列出了類路徑中的目錄,我發現org.project.root\bin但不是org.project.root。我現在知道運行時的META-INF定位爲org.project.root\META-INF,並且類路徑應該指向org.project.root,以便JPA和hibernate可以訪問查找persistence.xml。那麼是否會需要以某種方式改變類路徑以匹配這個?

+0

它看起來像我帶來了我的問題同一點,因爲這一個前http://stackoverflow.com/questions/1279060/jpa-with-toplink-no-meta-inf-persistence-xml-was-found-in-classpath但是這個問題似乎沒有被接受的答案,也沒有我沒有檢查過的問題。 – JRSofty 2011-05-27 10:34:28

回答

0

我給一個的Vineet最多投票幫助我知道哪裏是META-INF文件夾中結束了,但是,我終於想通了,我的權限是什麼問題。

java.io.FilePermission是分層的,這意味着您必須先給予較高文件夾的「讀取」權限,然後才能將其提供給較低的目錄。

基本上在我的安全策略文件我應該做的permission java.io.FilePermission "${user.dir}${/}-", "read";第一我進入permission java.io.FilePermission "${user.dir}${/}META-INF${/}-", "read";

1

原始問題並不表示在運行環境中是否存在src目錄。我會假設它不存在於運行時環境中,原因如下。

src目錄是在開發過程中通常需要表示源目錄的工件。在運行時,該目錄通常不存在於JAR文件的目錄結構中。

你可能會更好指定的權限爲一體,以授予讀取訪問:

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

編輯:

基於這樣的事實,沒有SecurityExceptions都扔了,一個PersistenceExcpetion是拋出時,看起來persistence.xml的內容可能無效。在StackOverflow中可以引用以下問題,但解決方案不需要與答案中描述的完全相同。

  1. javax.persistence.PersistenceException: No Persistence provider for EntityManager named customerManager
  2. No Persistence provider for EntityManager named …
+0

我沒有想到這一點。但是,我嘗試了您建議的權限路徑,但仍然無效。 – JRSofty 2011-05-27 07:33:39

+0

@JRSofty,您可能想要發佈已部署工件的目錄結構(而不​​是開發環境)。另外,發佈任何遇到特別是涉及'SecurityExceptions'的堆棧跟蹤都會有所幫助。可能需要比您預期更多的權限。 – 2011-05-27 07:35:51

+0

我已經添加了在此問題期間出現的唯一堆棧跟蹤。以及一些更多的信息告訴我,你在運行時的META-INF正處於'src'目錄之外是正確的。問題依然存在。 – JRSofty 2011-05-27 08:11:27