Spring注入Clock作为构造函数参数的问题

时间:2018-06-13 09:42:30

标签: java spring dependency-injection

我有一个类,它将java.time.Clock对象作为构造函数参数。 我在applicationContext.xml文件中将其定义为bean时遇到问题:

TimeTracker.java

public class TimeTracker{

    public final Clock clock;
    public TimeTracker(Clock clock){
        this.clock = clock;
    }

的applicationContext.xml

<bean id="timeTracker" 
        class="com.tracker.TimeTracker">
        <constructor-arg type="java.time.Clock" value=""/> 
</bean>

我遇到的错误是:不明确的构造函数参数类型 - 您是否将正确的bean引用指定为构造函数参数?

5 个答案:

答案 0 :(得分:2)

试试这样:

<bean class=“java.time.Clock” factory-method=“java.time.Clock.systemDefaultZone” name=“clock”/>

<bean id="timeTracker" 
    class="com.tracker.TimeTracker">
    <constructor-arg ref=“clock”/> 
</bean>

value属性仅适用于基本类型。

答案 1 :(得分:0)

您需要实例化一个时钟并将其用作参考。类似于:

<bean id="clock" class="java.time.clock"/>
<bean id="timeTracker" 
    class="com.tracker.TimeTracker">
    <constructor-arg type="java.time.Clock" ref="clock"/> 
</bean>

答案 2 :(得分:0)

尝试,

<bean id="timeTracker" class="com.tracker.TimeTracker">
        <constructor-arg>
          <bean class="java.time.Clock" factory-method="java.time.Clock.systemUTC" /> 
        </constructor-arg>
</bean>

答案 3 :(得分:0)

Strelok的解决方案几乎可以用,但是对我来说却失败了,因为您不需要定义工厂方法的完整路径。它是相对于工厂类的,因此,如果键入factory-method =“ java.time.Clock.systemDefaultZone”,它将在 java.time.Clock.java.time.Clock.systemDefaultZone()<中查找方法/ em>。

<bean id="systemClock" class="java.time.Clock" factory-method="systemUTC" />

<bean id="timeTracker" class="com.tracker.TimeTracker">
    <constructor-arg type="java.time.Clock" ref="systemClock"/> 
</bean>

使情况更糟的是,Spring异常并不是特别有用。

答案 4 :(得分:0)

Strelok的答案几乎可行,应该是-

<bean name=“clock” class=“java.time.Clock” factory-method=“systemDefaultZone” />