You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by "Thiago H. de Paula Figueiredo (JIRA)" <ji...@apache.org> on 2014/06/30 21:11:24 UTC

[jira] [Commented] (TAP5-2032) GenericsUtils does not handle generics properly when extracting the actual type

    [ https://issues.apache.org/jira/browse/TAP5-2032?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14047990#comment-14047990 ] 

Thiago H. de Paula Figueiredo commented on TAP5-2032:
-----------------------------------------------------

Could you please provide all the classes involved? There are pieces missing and the description above is confusing. In addition, could you please try with the latest 5.4 beta? Some problems in GenericUtils were fixed in the last couple of years.

> 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)