Xae*_*ess 6 java spring dependency-injection
我想知道为什么在Spring DI中以下bean定义有效(我使用bean实例化和静态工厂方法和Guava Suppliers.ofInstance):
<bean id="keySupplier" class="com.google.common.base.Suppliers"
factory-method="ofInstance">
<constructor-arg>
<value type="java.lang.String">someReallyLongValue <!-- note line break here -->
</value>
</constructor-arg>
</bean>
Run Code Online (Sandbox Code Playgroud)
但这个没有:
<bean id="keySupplier" class="com.google.common.base.Suppliers"
factory-method="ofInstance">
<constructor-arg type="java.lang.String" value="someReallyLongValue" />
</bean>
Run Code Online (Sandbox Code Playgroud)
它抛出以下异常:
org.springframework.beans.factory.BeanCreationException:在类路径资源中定义名称为'userRepo'的bean时出错:
(...)
通过构造函数参数表示不满意的依赖关系,类型为[java.lang.Object]的索引为0:
不明确的工厂方法参数类型 - 您是否将正确的bean引用指定为工厂方法参数?
问题是,在我的情况下,当我使用第一个bean定义并使用非常长的字符串作为值时,我的编辑器会在字符串的最后一个字符后断行,这会导致该字符串与其他空格一起传递,Suppliers.ofInstance结果它会破坏我的代码.
第二个定义对空格更严格,但令人惊讶的是,它不起作用(它可能无法处理泛型类型,尽管类型属性中指定了类型).
我可以强制Spring以<value>某种方式忽略标记中的空格吗?
或者我使用<constructor-arg type="java.lang.String" value="someReallyLongValue" />得当吗?或者我应该提交一个问题,因为它是一个Spring bug?
我宁愿不对字符串做任何假设(即string.trim()在这里使用).
根据有关构造函数解析的参考文档,这两个配置在Spring中不涉及相同的执行路径.失败来自用于此instanceOf方法的泛型,该方法声明Object为方法参数.
Spring必须完成以下任务才能成功:
type声明或基于方法参数类型时index使用所涉及的逻辑是在ConstructorArgumentValues保持器的方法getArgumentValue和在两个getIndexedArgumentValue和getGenericArgumentValue.两种方法都使用测试来ValueHolder根据可用信息拒绝.
在第二种配置方案中,使用索引检测并拒绝该值,因为所需类型String与之不完全匹配Object.完成此测试时ClassUtils.matchesTypeName不检查类型层次结构.
在第一个配置方案中,值保持器已准备好String对象,并且泛型参数机制已同意,因为该值可分配给检测到的方法参数类型.
从理论上讲,下面的表达式应该起作用,因为提供了类型来从值生成对象,并提供索引以避免任何猜测,即使只有一个方法匹配.
<constructor-arg index="0" type="java.lang.String" value="queueName" />
Run Code Online (Sandbox Code Playgroud)
运气不好,它没有改善任何东西,仍然使用相同的执行路径.我真的认为需要Spring改进.你可以创建一个JIRA票.
| 归档时间: |
|
| 查看次数: |
2085 次 |
| 最近记录: |