【问题标题】:Spring injection issue with constructor-arg overload [duplicate]构造函数参数重载的弹簧注入问题[重复]
【发布时间】:2014-09-17 17:10:34
【问题描述】:

我想问一下Spring Constructor Injection。 所以在课堂上,我有两个参数数量不同的构造函数。

public class MyClassHello() {
    public MyClassHello(String A) {
        // do sth
    }

    public MyClassHello(String A, int B){
        // do sth
    }
}

如果我尝试像这样注入来访问第一个构造函数,Spring 将无法工作,因为存在歧义。

<bean id="injectQuestion" class="MyClassHello">
    <constructor-arg index="0" value="A String"/>
</bean>

调试代码是这样的:

Unsatisfied dependency expressed through constructor argument with index 1 of type [java.lang.String]: Ambiguous constructor argument types.

我认为这意味着,Spring 需要知道索引 1 参数是否存在?

这与我们有两个具有相同数量参数的构造函数的通常情况不同。像这样,我可以设置类型以便在注入时进行区分。

在我的情况下,是否有强制 Spring 选择第一个构造函数?

非常感谢!!

【问题讨论】:

  • 虽然我觉得您当前的设置会导致任何歧义这很奇怪,但在您的构造函数定义中添加一个 type 属性以清除任何剩余的歧义。然后你应该有&lt;constructor-arg index ="0" type="java.lang.String" value="A String"/&gt;
  • @kolossus 这无济于事,我已经尝试过了,但结果仍然相同。对于这两个构造函数,第一个参数是一个字符串。我认为的问题是注入如何知道第二个参数是否存在。

标签: java spring code-injection constructor-injection spring-bean


【解决方案1】:

你可以使用名字:

<bean id= "InjectQuestion" class = "MyClassHello">
    <constructor-arg name = "A" value="A String"/>
</bean>

<bean id= "InjectQuestion" class = "MyClassHello">
    <constructor-arg name = "A" value="A String"/>
    <constructor-arg name = "B" value="42"/>
</bean>

请注意,您在声明类时的语法无效;并且在定义 bean 时,在 class="..." 中您应该使用类的完全限定名称(例如 packageName.subPackage.MyClassHello 而不仅仅是 MyClassHello

【讨论】:

  • 谢谢。我会试一试。对不起语法。
猜你喜欢
  • 1970-01-01
  • 2012-07-22
  • 2012-05-08
  • 2012-10-26
  • 2021-09-14
  • 2023-04-07
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多