如何在Spring中定义String数组的bean(使用XML配置)

Nir*_*jan 12 java spring

我正在尝试定义类型的Spring bean,String[]现在能够找到一种方法.示例程序如下所示:

@Component("sampleClass")
public class SampleClass {
    @Value("#{someArrayId}")
    private String[] someArray;

    public void doWithArray() {
        System.out.println(Arrays.toString(someArray));
    }
}
Run Code Online (Sandbox Code Playgroud)

Spring XML配置

<context:annotation-config />
<context:component-scan base-package="com.demo.spring" />

<util:list id="someArrayId">
    <array>
        <value>Tiger</value>
        <value>Lion</value>
    </array>
</util:list>
Run Code Online (Sandbox Code Playgroud)

当我运行该程序时,我得到以下异常:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sampleClass': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String[] com.demo.spring.SampleClass.someArray; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.util.ArrayList' to required type 'java.lang.String[]'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.Object[]] to required type [java.lang.String]: no matching editors or conversion strategy found
Run Code Online (Sandbox Code Playgroud)

我有点理解Spring在抱怨什么,但我不知道如何解决它.

感谢是否有人可以提供帮助.

谢谢,NN

Sot*_*lis 21

我不知道这是否是出于某种原因,但这种配置

<util:list id="someArrayId">
    <array>
        <value>Tiger</value>
        <value>Lion</value>
    </array>
</util:list>
Run Code Online (Sandbox Code Playgroud)

正在创建一个List包含一个元素的bean,其中包含Object[]两个String值.

如果你真的想要一个List有两个String值,你应该有

<util:list id="someArrayId">
    <value>Tiger</value>
    <value>Lion</value>
</util:list>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以修改要注释的字段

@Value("#{someArrayId.toArray(new java.lang.String[0])}")
Run Code Online (Sandbox Code Playgroud)

Spring的EL解析器将能够解析它并执行相应的方法,将其转换List为a String[].

或者,删除@Value注释并添加带@Resource注释的方法

@Resource(name = "someArrayId")
private void init(List<String> bean) {
    this.someArray = bean.toArray(new String[0]);
}
Run Code Online (Sandbox Code Playgroud)

我觉得这个更清洁,因为它更具描述性.


Ahs*_*hah 10

而不是List,只需定义数组.您也可以将其作为配置注入,以减少模糊.这里需要注意的另一点是value-type数组.

<bean id="sampleClass" class="somePackage.SampleClass">
    <property name="someArray">
        <array value-type="java.lang.String">
            <value>Tiger</value>
            <value>Lion</value>
        </array>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)


Evg*_*eev 5

试试这样

@Component("sampleClass")
public class SampleClass {
    @Value("#{someArrayId.toArray(new String[0])}")
    private String[] someArray;
    ...

<util:list id="someArrayId">
    <value>Tiger</value>
    <value>Lion</value>
</util:list>
Run Code Online (Sandbox Code Playgroud)