【问题标题】:Injecting 2D int array in a spring bean在 spring bean 中注入 2D int 数组
【发布时间】:2013-05-29 14:20:17
【问题描述】:

我见过how to inject an int array in spring bean。我想知道我们是否可以尝试注入二维数组。我尝试了以下代码:

...
<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 类的无效属性 'myIntArray' [com.rohit.spring.MyClass]:豆 属性“myIntArray”不可写或无效 设置方法。 setter的参数类型是否匹配return getter 的类型?”

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

【问题讨论】:

  • 您可以按照其他页面告诉您的方式将每个一维数组创建为单独的 bean,然后创建另一个 bean,它是这些 bean 的数组。
  • 嗨@Ben Green,是的,这是解决方法之一,但问题仍然是 - 是否超出了注入二维数组的范围,或者我没有遵循正确的语法。干杯!

标签: java spring multidimensional-array


【解决方案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>

更新:提供您自己的转换器

另一种方法是使用Converters。这是一个示例实现:

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>

如果需要,您可以修改代码以解释任何类型的字符串格式。 更多关于Converters的详情,可以关注here

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

【讨论】:

  • @Bashit Parikh:答案+1。我给出了我的实际问题的一个更简单的版本,每个数组中有大约 100 个条目,除了编写数百个 &lt;beans:value&gt;...&lt;/beans:value&gt; 之外,还有其他方法吗?谢谢。
【解决方案2】:

另一种方式

为了补充 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2014-10-14
    • 1970-01-01
    • 2018-12-26
    • 2015-02-20
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多