[
https://issues.apache.org/jira/browse/GROOVY-8313?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Paul King closed GROOVY-8313.
-----------------------------
> NullPointerException in TypeResolver when using generic array return type
> -------------------------------------------------------------------------
>
> Key: GROOVY-8313
> URL: https://issues.apache.org/jira/browse/GROOVY-8313
> Project: Groovy
> Issue Type: Bug
> Reporter: Eric Milles
> Assignee: Paul King
> Priority: Major
> Fix For: 2.4.13
>
>
> I think this is related to GROOVY-6899. I've been trying to isolate this for
> some time now: https://github.com/groovy/groovy-eclipse/issues/174. When
> using a generic array type as a return value, the bridge method is written
> improperly.
> {code}
> public interface MultiIndexed<PK, SK> {
> PK getPrimaryKey();
> SK[] getSecondaryKeys();
> }
> class MIData implements MultiIndexed<Integer, String> {
> final String value
> final Integer primaryKey
> final String[] secondaryKeys
> MIData(String val, Integer pk, String... sk) {
> this.value = val
> this.primaryKey = pk
> this.secondaryKeys = sk
> }
> }
> {code}
> javap on MiData.class shows {{public final SK[] getSecondaryKeys();}}. The
> equivalent Java class shows a different signature for the bridge method:
> {{public java.lang.Object[] getSecondaryKeys();}}.
> This causes an NPE under Introspector when bean info is trying to be resolved.
> {code}
> java.lang.NullPointerException
> at com.sun.beans.TypeResolver.resolve(TypeResolver.java:203)
> at com.sun.beans.TypeResolver.resolve(TypeResolver.java:162)
> at com.sun.beans.TypeResolver.resolveInClass(TypeResolver.java:81)
> at java.beans.FeatureDescriptor.getReturnType(FeatureDescriptor.java:370)
> at java.beans.Introspector.getTargetEventInfo(Introspector.java:1052)
> at java.beans.Introspector.getBeanInfo(Introspector.java:427)
> at java.beans.Introspector.getBeanInfo(Introspector.java:173)
> at groovy.lang.MetaClassImpl$15.run(MetaClassImpl.java:3289)
> at java.security.AccessController.doPrivileged(Native Method)
> at groovy.lang.MetaClassImpl.addProperties(MetaClassImpl.java:3287)
> at groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:3263)
> at
> org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:254)
> at
> org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:285)
> at MiData.$getStaticMetaClass(MiData.groovy)
> at MiData.<init>(MiData.groovy)
> class Main {
> static void main(String[] args) {
> def data = new MIData('V', 1, 'B')
> print 'no error'
> }
> }
> {code}
> I think this can be fixed in {{Verifier.getCovariantImplementation}}, like
> this:
> {code}
> // if we reach this point we have at least one parameter or return
> type, that
> // is different in its specified form. That means we have to create a
> bridge method!
> MethodNode newMethod = new MethodNode(
> oldMethod.getName(),
> overridingMethod.getModifiers() | ACC_SYNTHETIC | ACC_BRIDGE,
> // GRECLIPSE edit
> //oldMethod.getReturnType().getPlainNodeReference(),
> GenericsUtils.nonGeneric(oldMethod.getReturnType()),
> // GRECLIPSE end
> cleanParameters(oldMethod.getParameters()),
> oldMethod.getExceptions(),
> null
> );
> {code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)