You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Miklós Győrfi (Jira)" <ji...@apache.org> on 2023/11/17 11:19:00 UTC

[jira] [Created] (WICKET-7086) Injecting Spring bean may cause ClassCastException

Miklós Győrfi created WICKET-7086:
-------------------------------------

             Summary: Injecting Spring bean may cause ClassCastException
                 Key: WICKET-7086
                 URL: https://issues.apache.org/jira/browse/WICKET-7086
             Project: Wicket
          Issue Type: Bug
          Components: wicket-spring
    Affects Versions: 9.15.0
            Reporter: Miklós Győrfi


h3. Issue Summary:

The {{getBeanNameOfClass()}} method used for injecting Spring beans into Wicket components has a limitation when dealing with generic collection fields. The method is designed to look up a bean name based on the raw type of the collection (e.g., {{{}List{}}}). However, in scenarios where there are beans with more specific generic types (e.g., {{{}List<SomeClass>{}}}), the method incorrectly resolves and injects the bean, leading to potential {{ClassCastException}} issues at runtime.
h3. Problem Details:

When the field class is a generic collection (e.g., {{{}List<AnyClass>{}}}), the {{getBeanNameOfClass()}} method resolves a bean with the type of the raw collection (e.g., {{{}List{}}}). This behavior generally works as intended. However, when there are beans with more specific generic types (e.g., {{{}List<SomeClass>{}}}), the method incorrectly identifies and injects the bean, even if the generic types ({{{}SomeClass{}}} and {{{}AnyClass{}}}) do not match. This results in unexpected behavior and may cause {{ClassCastException}} errors later in the application.
h3. Reproduction Scenario:

This issue becomes apparent when using Apache Causeway in conjunction with Spring Data REST.  There is a bean named {{defaultMessageConverters}} (wich is a List) is inserted into {{CausewayWicketApplication}} within the {{applicationInitializers}} field, it is erroneously resolved based on the raw type, leading to improper injection.
h3. Proposed Solution:

Review and enhance the {{getBeanNameOfClass()}} method to consider generic types more accurately, ensuring that beans are resolved based on compatibility with the field's specific generic type. 

Problem is here:

 
{code:java}
List<String> names = new ArrayList<>(
    Arrays.asList(BeanFactoryUtils.beanNamesForTypeIncludingAncestors(ctx, clazz)));
 {code}
 

It uses the clazz, without generic.

Possible solution:

 
{code:java}
ResolvableType resolvableType = generic != null ? ResolvableType.forClassWithGenerics(clazz, generic) : ResolvableType.forClass(clazz);
List<String> names = new ArrayList<>(
    Arrays.asList(BeanFactoryUtils.beanNamesForTypeIncludingAncestors(ctx, resolvableType)));
 {code}
 

It is compatible with Spring from 4.2. 

 
h3. Additional Context:

This problem affects scenarios where generic collections are used in Spring-Wicket integration, and it becomes particularly prominent when Apache Causeway is utilized alongside Spring Data REST.

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)