如何在Spring XML中定义数组的数组或列表的列表?
嘿,我知道你在Spring XML里配置嵌套集合时遇到的麻烦了!你之前的尝试方向是对的,但少了关键的一步——明确指定嵌套元素的类型,所以Spring没法正确推断集合的结构。我来给你详细讲两种正确的配置方式:
一、配置数组的数组(Array of Arrays)
不管是把嵌套数组作为Bean的属性,还是直接定义一个嵌套数组类型的Bean,核心都是在外层<array>标签上指定value-type,明确内层元素是数组类型。
1. 作为Bean属性注入
假设你有这样一个Bean类:
public class MyArrayBean { private String[][] nestedStringArray; // Getter 和 Setter 方法 public String[][] getNestedStringArray() { return nestedStringArray; } public void setNestedStringArray(String[][] nestedStringArray) { this.nestedStringArray = nestedStringArray; } }
对应的Spring XML配置应该是:
<bean id="myArrayBean" class="com.example.MyArrayBean"> <property name="nestedStringArray"> <!-- 外层array指定value-type为String数组 --> <array value-type="java.lang.String[]"> <array> <value>aa</value> <value>ab</value> <value>ac</value> </array> <array> <value>ba</value> <value>bb</value> <value>bc</value> </array> </array> </property> </bean>
2. 直接定义嵌套数组Bean
如果要直接创建一个String[][]类型的Bean,可以通过构造函数注入:
<bean id="standaloneNestedArray" class="java.lang.String[][]"> <constructor-arg> <array value-type="java.lang.String[]"> <array> <value>aa</value> <value>ab</value> <value>ac</value> </array> <array> <value>ba</value> <value>bb</value> <value>bc</value> </array> </array> </constructor-arg> </bean>
二、配置列表的列表(List of Lists)
配置嵌套列表的思路和数组类似,需要在外层集合标签上指定value-type为java.util.List,同时如果使用Spring的util:list标签,记得先引入对应的命名空间。
1. 先引入util命名空间
在XML的根标签里添加以下命名空间声明:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
2. 作为Bean属性注入
假设你有这样的Bean类:
public class MyListBean { private List<List<String>> nestedStringList; // Getter 和 Setter 方法 public List<List<String>> getNestedStringList() { return nestedStringList; } public void setNestedStringList(List<List<String>> nestedStringList) { this.nestedStringList = nestedStringList; } }
方式一:使用util:list标签
<bean id="myListBean" class="com.example.MyListBean"> <property name="nestedStringList"> <!-- 外层util:list指定value-type为List --> <util:list value-type="java.util.List"> <util:list> <value>aa</value> <value>ab</value> <value>ac</value> </util:list> <util:list> <value>ba</value> <value>bb</value> <value>bc</value> </util:list> </util:list> </property> </bean>
方式二:使用普通标签
也可以不用util:list,直接用Spring内置的<list>标签,同样需要指定外层的value-type:
<bean id="myListBean" class="com.example.MyListBean"> <property name="nestedStringList"> <list value-type="java.util.List"> <list> <value>aa</value> <value>ab</value> <value>ac</value> </list> <list> <value>ba</value> <value>bb</value> <value>bc</value> </list> </list> </property> </bean>
3. 直接定义嵌套列表Bean
如果要直接创建一个List<List<String>>类型的Bean:
<bean id="standaloneNestedList" class="java.util.ArrayList"> <constructor-arg> <list value-type="java.util.List"> <list> <value>aa</value> <value>ab</value> <value>ac</value> </list> <list> <value>ba</value> <value>bb</value> <value>bc</value> </list> </list> </constructor-arg> </bean>
为什么之前的配置失败?
你之前的代码里没有在外层集合标签上指定value-type,Spring无法自动推断内层的<array>或<list>应该被解析成什么类型的元素。加上value-type之后,Spring就明确知道外层集合的每个元素都是数组或者列表,就能正确解析嵌套结构了。
内容的提问来源于stack exchange,提问作者scorpdaddy
相关产品推荐
相关产品推荐

