2009-11-11 268 views
0

我希望能够从Spring配置,我明确地宣布我的参数的类型创建Tuple2如何从Java/Spring创建一个类型化的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> 

这不起作用(我在我的配置文件中规定的有关属性编辑器)。在运行时出现错误:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'scala.Tuple2#6504bc' defined in file [C:\Work\myproj\config\test\myproj.xml]: Unsatisfied dependency expressed through constructor argument with index 0 of type [java.lang.Object]:
Ambiguous constructor argument types - did you specify the correct bean references as constructor arguments?

错误消失,如果我不声明明确type - 但是当然我在程序的Tuple2只是(String, String)这不是我想要的。


编辑对于那些你们谁不知道这个,Spring使用PropertyEditor s到从字符串创建实例如下:

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> 

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

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

或者,Spring也可以从你的setter方法中找出泛型类型参数。除了我的Tuple2似乎没有工作!

+0

您是否尝试单独创建TimeZone bean,然后将其引用为Tuple2构造函数的参数? 另外,春天如何将字符串转换为TimeZones? – 2009-11-11 16:37:05

+0

乔恩 - 我已经修改了我的问题以及如何做到这一点 – 2009-11-11 16:47:16

+0

我不认为这里有什么特别的scala。在java中定义像“Pair ”这样的泛型类应该等同于Tuple2。类型擦除将使构造函数看起来像:public scala.Tuple2(java.lang.Object,java.lang.Object) – 2009-11-11 17:14:15

回答

1

您需要明确使用类TimeZone的静态方法getTimeZone获取()创建时区参数:

<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> 
+0

我不应该这样做,沃尔特。例如,我可以按照上面描述的方式创建一个“Map”,其值类型是“TimeZone”。 – 2009-11-11 16:38:47

0

它可能会工作地图,因为弹簧具有通过您指定的语法为它特别支持:

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

在这种情况下,弹簧可能确定它应当基于String类型的设置值和请求的类型和TimeZone之间的不匹配调用的属性编辑器。