Ben Weidig created TAP5-2758:
--------------------------------
Summary: Constructor/Builder injection should support @Symbol for
List/Collection/Map even without @Inject
Key: TAP5-2758
URL: https://issues.apache.org/jira/browse/TAP5-2758
Project: Tapestry 5
Issue Type: Improvement
Components: tapestry-ioc
Affects Versions: 5.8.3
Reporter: Ben Weidig
If a constructor/builder method for a Service that has any type of
configuration has also another {{{}List{}}}/{{{}Collection{}}}/{{{}Map{}}}, a
{{RuntimeException}} gets thrown
({{{}org.apache.tapestry5.ioc.internal.AbstractServiceCreator{}}}:95)
Adding @Symbol to the arguments doesn't help, it also requires {{@Inject}} to
work.
This behavior stems from
{{org.apache.tapestry5.ioc.internal.util.InternalUtils.calculateInjection(Class,
Type, Annotation[], ObjectLocator, InjectionResources)}} which analyzes
parameters and decides "how" to inject the value.
Symbols work because no other injection variant is found first.
However, if the parameter is a {{{}List{}}}/{{{}Collection{}}}/{{{}Map{}}},
it's always treated as a configuration, unless an {{@Inject}} is present.
In my opinion, this is not the best way to handle this.
{{@Symbol}} should be as significant as other annotations, as a symbol can't be
target of a configuration.
To not rely on the fallback, I propose adding a check for {{{}@Symbol{}}}.
My local proof of concept works but also highlighted the lack of tests for the
edge case of duplicate possible configuration parameters.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)