3

GlassFish v3.1.2 アプリケーション サーバー上の JavaEE6 Web アプリケーションで Apache Shiro (v1.2) を使用しようとしています。

jdbc/mydsGlassFish で、JPA2 で動作することをテストしたデータソース () をセットアップしました。

Shiro JDBC レルムを使用してユーザーを認証するために、同じデータソースを使用したいと考えています。

私はshiro.iniに次のものを持っています:

# DataSource config
ds                = org.apache.shiro.jndi.JndiObjectFactory 
ds.requiredType   = javax.sql.DataSource
ds.resourceName   = jdbc/myds

# JDBC realm config
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.permissionsLookupEnabled = false
jdbcRealm.authenticationQuery = SELECT password FROM user_account WHERE email = ?
jdbcRealm.userRolesQuery = SELECT role_name FROM user_group_membership WHERE email = ?
jdbcRealm.dataSource = $ds

アプリケーションをデプロイすると、次の例外 (要約) が発生します。

FINE: Encountered object reference '$ds'.  Looking up object with id 'ds'
FINEST: Applying property [dataSource] value [org.apache.shiro.jndi.JndiObjectFactory@2ca061] on object of type [org.apache.shiro.realm.jdbc.JdbcRealm]
SEVERE: Unable to start Filter: [Unable to set property 'dataSource' with value [$ds] on object of type org.apache.shiro.realm.jdbc.JdbcRealm.  If '$ds' is a reference to another (previously defined) object, prefix it with '$' to indicate that the referenced object should be used as the actual value.  For example, $$ds].
org.apache.shiro.config.ConfigurationException: Unable to set property 'dataSource' with value [$ds] on object of type org.apache.shiro.realm.jdbc.JdbcRealm.  If '$ds' is a reference to another (previously defined) object, prefix it with '$' to indicate that the referenced object should be used as the actual value.  For example, $$ds
at org.apache.shiro.config.ReflectionBuilder.applyProperty(ReflectionBuilder.java:373)
at org.apache.shiro.config.ReflectionBuilder.applySingleProperty(ReflectionBuilder.java:198)
at org.apache.shiro.config.ReflectionBuilder.applyProperty(ReflectionBuilder.java:159)
at org.apache.shiro.config.ReflectionBuilder.buildObjects(ReflectionBuilder.java:119)
...
...
Caused by: java.lang.IllegalArgumentException: Cannot invokeorg.apache.shiro.realm.jdbc.JdbcRealm.setDataSource on bean class 'class org.apache.shiro.realm.jdbc.JdbcRealm' - argument type mismatch - had objects of type "org.apache.shiro.jndi.JndiObjectFactory" but expected signature "javax.sql.DataSource"
at org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:2235)
at org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:2151)
at org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1957)
...

代わりに、実際の MySQL データ ソースを定義すると、正常に動作します。

ds = com.mysql.jdbc.jdbc2.optional.MysqlDataSource 
ds.serverName = localhost
ds.user = root
ds.password = root
ds.databaseName = mydb

どんな助けでも大歓迎です。

4

1 に答える 1

1

これは、クラスパスの問題である可能性が高いようです。スタック トレースは、shiro 1.1.0 で意味のある ReflectionBuilder の行番号を参照します。ただし、shiro 1.2.0 では意味がありません。ただし、JndiObjectFactory は shiro 1.2.0 で新しく、両方のクラスが shiro-core にあるため、クラスパスに両方の jar がある可能性があります。

最初に war ファイルを調べて、両方の jar がそこにないことを確認してください。そうである場合は、1.1.0 バージョンを削除することで war ファイルを修正できます。そうでない場合は、glassfish インフラストラクチャを介して古いバージョンの shiro を継承しているかどうかを確認し始めます。

于 2012-08-06T13:23:39.107 に答える