Apache Shiro с JdbcRealm и JndiObjectFactory вызывает исключение IllegalArgumentException

Я пытаюсь использовать Apache Shiro (v1.2) в веб-приложении JavaEE6 на сервере приложений GlassFish v3.1.2.

В GlassFish я настроил источник данных (jdbc/myds), который я протестировал для работы через 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

Любая помощь горячо приветствуется.


person Allan Lykke Christensen    schedule 06.08.2012    source источник


Ответы (1)


Похоже, это проблема с classpath. Трассировка стека ссылается на номера строк для ReflectionBuilder, которые имеют смысл в shiro 1.1.0. Однако они не имеют смысла в широ 1.2.0. Однако, поскольку JndiObjectFactory является новым в shiro 1.2.0, и оба класса находятся в shiro-core, кажется вероятным, что у вас есть оба jar-файла в пути к классам.

Сначала вы должны заглянуть в свой военный файл, убедиться, что там нет обеих банок. Если это так, вы можете исправить свой военный файл, удалив версию 1.1.0. Если нет, я бы начал искать, не наследуете ли вы как-то старую версию shiro через инфраструктуру Glassfish.

person jbunting    schedule 06.08.2012
comment
Вы правы! После обновления до 1.2.0 (хотя Maven) я не делал чистую сборку, чтобы старые JAR-файлы все еще были там. Спасибо! - person Allan Lykke Christensen; 06.08.2012
comment
К вашему сведению: версия 1.2.1 была выпущена только что, если вы обновляетесь, я бы порекомендовал перейти прямо к ней. Он включает в себя несколько ключевых исправлений. - person jbunting; 06.08.2012
comment
Спасибо - обновился до 1.2.1 - не заметил, были ли проблемы с 1.2.0, но работает отлично. - person Allan Lykke Christensen; 07.08.2012