我希望能够从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
!
答案 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
提供的值与请求的类型TimeZone
和Integer
之间的不匹配来确定它应该调用属性编辑器。