0

我希望能够Tuple2从 spring 配置中创建一个我明确声明参数类型的地方:

<bean class="scala.Tuple2">
      <constructor-arg index="0" value="Europe/London" type="java.util.TimeZone" />
      <constructor-arg index="1" value="America/New_York" type="java.util.TimeZone" />
</bean>

这不起作用(我在我的配置文件中指定了相关的属性编辑器)。在运行时我收到错误:

原因:org.springframework.beans.factory.UnsatisfiedDependencyException:
创建文件 [C:\Work\myproj\config\test\myproj.xml] 中定义的名称为 'scala.Tuple2#6504bc' 的 bean 时出错:通过构造函数表示的依赖关系不满足类型为 [java.lang.Object] 的索引为 0 的参数:
构造函数参数类型不明确- 您是否将正确的 bean 引用指定为构造函数参数?

如果我不声明显式,错误就会消失type- 但是当然Tuple2我的程序中的只是一个(String, String)不是我想要的。


对于那些不知道这一点的人,请编辑,Spring 使用PropertyEditors 从字符串创建实例,如下所示:

public class TimeZoneEditor extends java.beans.PropertyEditorSupport {
    public void setAsText(String text) { setValue(TimeZone.getTimeZone(text)); }
    public String getAsText() { return ((TimeZone)getValue()).getID(); }
}

现在我只是在我的配置中声明:

<bean id="customEditorConfigurer" 
       class="org.springframework.beans.factory.config.CustomEditorConfigurer">   
    <property name="customEditors"> 
        <map>
            <entry key="java.util.TimeZone">
                <bean class="my.cleve.rutil.TimeZoneEditor"/> 
            </entry>
        </map>
    </property> 
</bean>

嘿,我可以做这样的事情:

<map key-type="java.util.TimeZone" value-type="java.lang.Integer">
    <entry key="Europe/London" value="4" />
</map>

或者,Spring 可以从您的 setter 方法中找出泛型类型参数。除了在我的情况下它似乎不起作用Tuple2

4

2 回答 2

1

您需要使用 TimeZone 类的静态方法 getTimeZone() 显式创建 TimeZone 参数:

<bean class="scala.Tuple2">
  <constructor-arg index="0">
    <bean class="java.util.TimeZone" factory-method="getTimeZone">
      <constructor-arg value="Europe/London"/>
    </bean>
  </constructor-arg>
  <constructor-arg index="1">
    <bean class="java.util.TimeZone" factory-method="getTimeZone">
      <constructor-arg value="America/New_York"/>
    </bean>
  </constructor-arg>
</bean>
于 2009-11-11T16:37:06.350 回答
0

It may be working for Map because spring has special support for it through the syntax you specified:

<map key-type="java.util.TimeZone" value-type="java.lang.Integer">

In this case, spring probably determines it should invoked the property editors based on the mismatch between the provided values of type String and the requested types TimeZone and Integer.

于 2010-01-23T23:52:42.680 回答