我见过how to inject an int array in spring bean。我想知道我们是否可以尝试注入2d阵列。我尝试了以下代码:
...
<bean id="myBean" class="com.rohit.spring.MyClass">
<property name="myIntArray" value="{1,2,3},{4,5,6},{7,8,9}" />
</bean>
...
该课程如下:
Class MyCLass
{
private Integer[][] myIntArray;
public Integer[][] getMyIntArray(){
return this.myIntArray;
}
public void setMyIntArray(Integer[][] myIntArray){
this.myIntArray = myIntArray;
}
}
抛出的错误如下:
&#34;无效的属性&#39; myIntArray&#39;豆类 [com.rohit.spring.MyClass]:Bean 财产&#39; myIntArray&#39;不可写或无效 二传法。 setter的参数类型是否与返回匹配 吸气剂的类型?&#34;
不知道是不可能还是我做错了什么?
答案 0 :(得分:1)
你可以这样做:
<beans:bean id="someClass" class="com.you.SomeClass" >
<beans:property name="myIntArray">
<beans:list>
<beans:list>
<beans:value>1</beans:value>
<beans:value>2</beans:value>
<beans:value>3</beans:value>
</beans:list>
<beans:list>
<beans:value>4</beans:value>
<beans:value>5</beans:value>
<beans:value>6</beans:value>
</beans:list>
<beans:list>
<beans:value>7</beans:value>
<beans:value>8</beans:value>
<beans:value>9</beans:value>
</beans:list>
</beans:list>
</beans:property>
</beans:bean>
或者:
<beans:bean id="someClass" class="com.you.SomeClass" >
<beans:property name="myIntArray">
<beans:array>
<beans:array>
<beans:value>1</beans:value>
<beans:value>2</beans:value>
<beans:value>3</beans:value>
</beans:array>
<beans:array>
<beans:value>4</beans:value>
<beans:value>5</beans:value>
<beans:value>6</beans:value>
</beans:array>
<beans:array>
<beans:value>7</beans:value>
<beans:value>8</beans:value>
<beans:value>9</beans:value>
</beans:array>
</beans:array>
</beans:property>
</beans:bean>
更新:提供您自己的转换器
另一种方法是使用Converter。以下是一个示例实现:
public class IntArrayConverter implements Converter<String, int[][]> {
@Override
public int[][] convert(String source) {
if(isBlank(source)) {
return new int[0][0];
}
String[] subArraysStrs = source.split(":");
int[][] result = new int[subArraysStrs.length][];
for(int i = 0; i < subArraysStrs.length; i++) {
String subArrayStr = trim(subArraysStrs[i]);
if(isBlank(subArrayStr)) {
throw new IllegalArgumentException();
}
String[] subArrayElementStrs = subArrayStr.split(",");
int[] subArray = new int[subArrayElementStrs.length];
for(int j = 0; j < subArray.length; j++) {
String elementStr = trim(subArrayElementStrs[j]);
subArray[j] = Integer.parseInt(elementStr);
}
result[i] = subArray;
}
return result;
}
}
现在,告诉spring它可以通过在配置中声明以下内容来使用此转换器:
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.example.IntArrayConverter" />
</list>
</property>
</bean>
然后:
<bean class="com.you.SomeClass">
<property name="myIntArray" value="1,2,3:4,5,6:7,8,9"></property>
</bean>
为了简单起见,实现了我的Converter以便在每个子阵列周围没有花括号的情况下使用。也就是说,而不是
<property name="myIntArray" value="{1,2,3},{4,5,6},{7,8,9}"></property>
我要去
<property name="myIntArray" value="1,2,3:4,5,6:7,8,9"></property>
如果需要,可以修改代码以解释任何类型的字符串格式。 有关Converter的详细信息,请查看here。
注意:已注册的ConversionService
将可用于整个应用。也就是说,只要需要将String
转换为int[][]
,就会使用它。此外,即使您只提供一个转换器,所有默认转换器都会被注册,因此您不会失去它们的好处。
答案 1 :(得分:1)
为了补充Bhashit Parikh的答案,另一种通过XML配置文件注入int[][]
数组的简单方法如下:
<beans:bean id="someClass" class="com.you.SomeClass" >
<beans:property name="myIntArray">
<beans:list>
<beans:value>1,2,3</beans:value>
<beans:value>4,5,6</beans:value>
<beans:value>7,8,9</beans:value>
</beans:list>
</beans:property>
</beans:bean>