Как я могу создать типизированный Tuple2 из Java / Spring? - PullRequest
0 голосов
/ 11 ноября 2009

Я хочу иметь возможность создать 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:
Ошибка создания бина с именем 'scala.Tuple2 # 6504bc', определенного в файле [C: \ Work \ myproj \ config \ test \ myproj.xml]: неудовлетворенная зависимость, выраженная через аргумент конструктора с индексом 0 типа [java.lang.Object] :
Неоднозначные типы аргументов конструктора - вы указали правильные ссылки на компоненты в качестве аргументов конструктора?

Ошибка исчезнет, ​​если я не объявлю явное 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>

И эй Престо, я могу сделать что-то вроде:

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

Или же Spring может выяснить параметры универсального типа из ваших методов установки. За исключением того, что это не работает в случае моего Tuple2!

Ответы [ 2 ]

1 голос
/ 11 ноября 2009

Вам нужно будет создать параметры 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>
0 голосов
/ 24 января 2010

Это может работать для Map, потому что у Spring есть специальная поддержка для него через указанный вами синтаксис:

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

В этом случае Spring, вероятно, решит, что должен вызывать редакторы свойств на основе несоответствия между предоставленными значениями типа String и запрошенными типами TimeZone и Integer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...