1

我已经看到如何在 spring bean 中注入一个 int 数组。我想知道我们是否可以尝试注入二维数组。我尝试了以下代码:

...
<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;
    }
}

抛出的错误内容如下:

“bean 类 [com.rohit.spring.MyClass] 的属性 'myIntArray' 无效:Bean 属性 'myIntArray' 不可写或具有无效的 setter 方法。setter 的参数类型是否与 getter 的返回类型匹配?”

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

4

2 回答 2

2

你可以这样做:

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

为了简单起见,我的转换器被实现为在每个子数组周围不带花括号的情况下使用。也就是说,而不是

<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的更多详细信息,您可以查看此处

注意:注册ConversionService将可用于您的整个应用程序。也就是说,只要需要将 aString转换为int[][]. 此外,即使您只提供一个转换器,所有默认转换器无论如何都会注册,因此您不会失去它们的好处。

于 2013-05-29T15:25:07.637 回答
1

还有一种方式

为了补充 Bhashit Parikh 的答案,另一种int[][]通过 XML 配置文件注入数组的简单方法如下:

<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>
于 2013-06-25T18:26:58.423 回答