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 12:35:00 UTC

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

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

Miklós Győrfi updated WICKET-7086:
----------------------------------
    Priority: Minor  (was: Major)

> 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
>            Priority: Minor
>
> 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)