在spring bean中注入2D int数组

时间:2013-05-29 14:20:17

标签: java spring multidimensional-array

我见过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;

不知道是不可能还是我做错了什么?

2 个答案:

答案 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>