[
https://issues.apache.org/jira/browse/ARIES-1288?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Guillaume Nodet resolved ARIES-1288.
------------------------------------
Resolution: Fixed
Fix Version/s: blueprint-core-1.4.4
Committing to https://svn.apache.org/repos/asf/aries/trunk ...
M
blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/ReflectionUtils.java
Committed r1690283
> ClassCastException with proxy set in bean of generic class
> ----------------------------------------------------------
>
> Key: ARIES-1288
> URL: https://issues.apache.org/jira/browse/ARIES-1288
> Project: Aries
> Issue Type: Bug
> Components: Blueprint
> Affects Versions: blueprint-core-1.4.2
> Reporter: Ancoron Luciferis
> Assignee: Guillaume Nodet
> Fix For: blueprint-core-1.4.4
>
> Attachments: ARIES-1288-Take-generic-type-variables-into-account.patch
>
>
> I have a blueprint configuration as follows (actually from a third-party
> application):
> {code:xml}
> <?xml version="1.0" encoding="UTF-8"?>
> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0"
> xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0"
> xsi:schemaLocation="
> http://www.osgi.org/xmlns/blueprint/v1.0.0
> http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
> http://aries.apache.org/xmlns/jpa/v1.0.0
> http://aries.apache.org/xmlns/jpa/v1.0.0
> http://aries.apache.org/xmlns/transactions/v1.0.0
> http://aries.apache.org/xmlns/transactions/v1.0.0">
> <bean id="meterDaoBean" class="com.third.party.impl.dao.jpa.JpaMeterDao">
> <jpa:context unitname="MeterUnit" property="entityManager" />
> </bean>
> <reference id="securityService"
> interface="com.third.party.api.SecurityService" availability="optional"/>
> <bean id="secureMeterDaoBean"
> class="com.third.party.impl.dao.secure.SecureMeterDao">
> <property name="dao" ref="meterDaoBean" />
> <property name="securityService" ref="securityService" />
> </bean>
> <bean id="meterBean" class="com.third.party.impl.MeterServiceImpl">
> <tx:transaction method="*" value="Required" />
> <property name="meterDao" ref="secureMeterDaoBean" />
> </bean>
> <service ref="meterBean" interface="com.third.party.api.MeterService"/>
> </blueprint>
> {code}
> ...and the (for this issue relevant) class definitions look as follows:
> {code}
> public interface CrudDao<T> {
> }
> public abstract class SecureDao<T, R extends CrudDao<T>> implements
> CrudDao<T> {
> protected R dao;
> // ...
> public void setDao(R dao) {
> this.dao = dao;
> }
> }
> public interface MeterDao extends CrudDao<MeterEntity> {
> }
> public class JpaMeterDao extends JpaCrudDao<MeterEntity> implements MeterDao {
> }
> public class SecureMeterDao extends SecureDao<MeterEntity, MeterDao>
> implements MeterDao {
> // ...
> public MeterEntity get(String id) {
> // some security stuff...
> dao.get(id);
> }
> }
> {code}
> \\
> ...now with that usage of generics the proxy that gets created for the "dao"
> member in the {{SecureMeterDao}} bean instance only implements {{CrudDao}},
> but not {{MeterDao}}.
> So, although the initial blueprint setup of beans and services is fine, any
> call traveling through the {{SecureMeterDao}} results in a
> {{ClassCastException}}:
> {noformat}
> java.lang.ClassCastException: Proxyf427f861_7a7d_41e8_98c7_a09aea99f756
> cannot be cast to com.third.party.impl.dao.MeterDao
> at
> com.third.party.impl.dao.secure.SecureMeterDao.get(SecureMeterDao.java:47)
> at com.third.party.impl.MeterServiceImpl.get(MeterServiceImpl.java:96)
> at Proxy8bef53d7_0df3_4724_a67c_fb296af2aee2.get(Unknown Source)
> at Proxya8f9ae87_fa39_42ae_bf11_baa82efa76cc.get(Unknown Source)
> ...
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)