[ 
https://issues.apache.org/jira/browse/TAP5-2032?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Thiago H. de Paula Figueiredo reassigned TAP5-2032:
---------------------------------------------------

    Assignee: Thiago H. de Paula Figueiredo

> GenericsUtils does not handle generics properly when extracting the actual 
> type
> -------------------------------------------------------------------------------
>
>                 Key: TAP5-2032
>                 URL: https://issues.apache.org/jira/browse/TAP5-2032
>             Project: Tapestry 5
>          Issue Type: Bug
>          Components: tapestry-ioc
>    Affects Versions: 5.3.6
>            Reporter: DI Florian Hackenberger
>            Assignee: Thiago H. de Paula Figueiredo
>
> We have the following interfaces / classes
> public interface IPersonWithRoleAssociation<A> extends 
> IEntityAssociationWithInfo<A, Person> {
>       PersonRole getRole();
>       void setRole(PersonRole role);
> }
> public interface IEntityAssociationWithInfo<P, C> {
>       P getParent();
>       void setParent(P parent);
>       C getChild();
>       void setChild(C child);
> }
> public class Person implements Serializable {
>       ....
>       String name;
>       public String getName() {
>               return name;
>       }
> }
> and the page:
> public class EditPersonsWithRoles {
>       @Property(write=false) IPersonWithRoleAssociation<A> personWithRole;
> }
> and the template snippet:
> <t:textfield t:id="personSex" t:value="personWithRole.child.name"/>
> Leads to the following exception:
> Exception generating conduit for expression 'personWithRole.child.name': ...
> ...
> Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
>       at 
> org.apache.tapestry5.ioc.internal.util.GenericsUtils.resolve(GenericsUtils.java:388)
>  ~[tapestry-ioc-5.3.6.jar:na]
>       at 
> org.apache.tapestry5.ioc.internal.util.GenericsUtils.resolve(GenericsUtils.java:128)
>  ~[tapestry-ioc-5.3.6.jar:na]
>       at 
> org.apache.tapestry5.ioc.internal.util.GenericsUtils.extractActualType(GenericsUtils.java:74)
>  ~[tapestry-ioc-5.3.6.jar:na]
>       at 
> org.apache.tapestry5.internal.services.PropertyConduitSourceImpl$PropertyConduitBuilder.buildGetterMethodAccessTerm(PropertyConduitSourceImpl.java:1119)
>  ~[tapestry-core-5.3.6.jar:na]
> At GenericsUtils.java:388 we have:
> resolved = ((ParameterizedType) t).getActualTypeArguments()[i];
> where:
> i = 1
> resolved = C
> ((ParameterizedType) t).getActualTypeArguments() = 
> [org.topfive.entities.IPersonWithRoleAssociation<P>]
> so the problem seems to be that the code assumes that it can find the type 
> information for C as the second generic parameter for 
> IPersonWithRoleAssociation, when in fact is is the second generic parameter 
> for the superclass IEntityAssociationWithInfo which 
> IPersonWithRoleAssociation extends and passes C explicitly (Person). 
> Everything is fine, if I use a marker interface for Person (IPerson) and 
> declare:
> public interface IPersonWithRoleAssociation<A, P extends IPerson> extends 
> IEntityAssociationWithInfo<A, P>



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to