如何从Java / Spring创建一个类型化的Tuple2?

时间:2009-11-11 16:08:17

标签: java scala spring tuples

我希望能够从spring config创建Tuple2,我明确声明了我的参数类型:

<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] :
  不明确的构造函数参数类型 - 您是否将正确的bean引用指定为构造函数参数?

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


为那些不知道这个的人编辑,Spring使用PropertyEditor来从Strings创建实例,如下所示:

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

它可能适用于Map,因为spring通过您指定的语法对它有特殊支持:

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

在这种情况下,spring可能会根据类型String提供的值与请求的类型TimeZoneInteger之间的不匹配来确定它应该调用属性编辑器。