Самый простой способ указать список со значениями в Spring?
Предположим, что у меня есть большой список значений aa bb cc dd ee ff gg и т.д., которые мне нужно передать как конструктор в spring
Если мне нужно настроить как строковый массив, это легко в spring, поскольку мы можем просто указать значения как разделенные запятыми как aa, bb, cc и т.д.,
Если мне нужно настроить как список, мне нужно сделать, как показано ниже
<bean name="myBean" class="MyClass">
<constructor-arg>
<list>
<value>aa</value>
<value>bb</value>
<value>cc</value>
<value>dd</value>
</list>
</constructor-arg>
</bean>
Когда число значений увеличилось, он занимает огромные линии и выглядит уродливо.
Может кто-нибудь, пожалуйста, помогите мне, как мы можем передавать большие значения в виде списка в качестве конструктора?
Ответы
Ответ 1
Значения передаются в список, поступающий из файла свойств?
Если это так, вы можете использовать что-то вроде этого:
<bean name="myBean" class="MyClass">
<constructor-arg>
<bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
<constructor-arg type="java.lang.String" value="${list.value}"/>
</bean>
</constructor-arg>
</bean>
со следующим файлом .properties
list.value=aa,bb,cc,dd
И если нет, вы можете просто передать сразу:
<bean name="myBean" class="MyClass">
<constructor-arg>
<bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
<constructor-arg type="java.lang.String" value="aa,bb,cc,dd"/>
</bean>
</constructor-arg>
</bean>
Ответ 2
Spring может автоматически преобразовывать любую строку, разделенную запятой, в список или массив:
public class Foo {
public void setValueList(String[] values) { ... }
}
<bean class="Foo"
p:valueList="a,b,c,d" />
<bean class="Foo"
c:_0="a,b,c,d" />
<bean class="Foo">
<constructor-arg><value>a,b,c,d</value></constructor-arg>
</bean>
На самом деле, даже если в строке есть только 1 значение, и никаких запятых нет, он все равно будет работать.
Нет необходимости в вызове org.springframework.util.StringUtils, который кто-то упомянул в другом ответе.
Эти слова для конструктора также args (c: _0 является сокращением для < конструктор-arg index = "0" & gt; с использованием пространства имен c.
Ответ 3
Вы можете попробовать что-то еще более простое и использовать язык выражения Spring для преобразования значений в список:
<bean name="myBean" class="MyClass">
<constructor-arg value="#{T(java.util.Arrays).asList('${list.values}')}"/>
</bean>
Ответ 4
Вы можете реализовать конструктор, который принимает в качестве аргумента строку с разделителями-запятыми (и сама разделяет эту строку в значениях).
Если вы хотите, чтобы решение, которое работает для любого конструктора/свойства, вы могли бы посмотреть на реализацию своего собственного PropertyEditor
и configure Spring, чтобы использовать его.