论坛首页 Java企业应用论坛

如何配置一个带泛型的Bean?

浏览 15115 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-07-24   最后修改:2013-07-24
希望在Spring容器中配置一个带泛型的Bean,直接配置如下:
<bean id="list" class="java.util.ArrayList<java.lang.String>"/>


启动容器时,将报如下所示:
Caused by: org.xml.sax.SAXParseException: The value of attribute "class" associated with an element type "null" must not contain the '<' character.
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1427)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(XMLScanner.java:945)


这是因为“<”或“>”的字符是XML的特殊字符,它会破坏Spring XML配置文件的格式,因此产生了错误


由于Spring 3.0引入了JavaConfig,以代码的方式定义Bean,因此我们可以使用如下方式配置之:
package com.ioctest; /**
 * Copyright:中软海晟信息科技有限公司 版权所有 违者必究 2013 
 */

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class AppConfig {

    @Bean(name = "listStr")
    public List<String> listStrBean(){
        return new ArrayList<String>();
    }
}


在XML配置文件中引用这个JavaConfig:
<?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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!--     <bean id="list" class="java.util.ArrayList<java.lang.String>"/>-->

    <context:component-scan base-package="com.ioctest"/>
    <context:annotation-config/>

</beans>


这个就可以正确启动了:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class Tester {

    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("test.xml");
        List<String> listStr = (List<String>) applicationContext.getBean("listStr");
        listStr.add("ddd");
    }
}
   发表时间:2013-07-24  
这个的话可以使用util命名空间
<util:list list-class="" value-type=""/>
0 请登录后投票
   发表时间:2013-07-24  
jinnianshilongnian 写道
这个的话可以使用util命名空间
<util:list list-class="" value-type=""/>


哈 我这里只是拿它来说泛型的Bean的,如果是在声明List Bean最地道地是你这个TAG
0 请登录后投票
   发表时间:2013-07-24   最后修改:2013-07-24
stamen 写道
jinnianshilongnian 写道
这个的话可以使用util命名空间
<util:list list-class="" value-type=""/>


哈 我这里只是拿它来说泛型的Bean的,如果是在声明List Bean最地道地是你这个TAG

理解错了 如果用xml配置bean还确实搞不定。如果不用Java Config方式,不过我想还可以用FactoryBean或静态工厂解决,因为只要返回值类型上有泛型即可。本来想spel是否可以,不过想了想,因为这个泛型信息存储在class文件中,所以用动态创建方式肯定搞不定。
0 请登录后投票
   发表时间:2013-07-24  
我在想,这样有意义吗。
Java伪泛型,不论你怎么写,最后还是返回一个可以容纳任何Object对象的ArrayList。
0 请登录后投票
   发表时间:2013-07-24  
luliruj 写道
我在想,这样有意义吗。
Java伪泛型,不论你怎么写,最后还是返回一个可以容纳任何Object对象的ArrayList。

刚开始我也是以为这样,但仔细看了下,这样可以得到泛型实参类型,是这个目的
0 请登录后投票
   发表时间:2013-07-24  
多次一舉,無非是想減少類型轉換的代碼,果斷用spring convert

0 请登录后投票
   发表时间:2013-07-25   最后修改:2013-07-25
luliruj 写道
我在想,这样有意义吗。
Java伪泛型,不论你怎么写,最后还是返回一个可以容纳任何Object对象的ArrayList。


重点不在ArrayList<String>,而在如何声明一个泛型Bean的方法。
0 请登录后投票
   发表时间:2013-07-26  
stamen 写道
luliruj 写道
我在想,这样有意义吗。
Java伪泛型,不论你怎么写,最后还是返回一个可以容纳任何Object对象的ArrayList。


重点不在ArrayList<String>,而在如何声明一个泛型Bean的方法。


<bean id="list" class="java.util.ArrayList<java.lang.String>"/>

你如果非要用特殊字符,xml文档有定义的,需要转义,貌似就是
<bean id="list" class="java.util.ArrayList&lt;java.lang.String&gt;"/>

不过你这样我想是无效的。
0 请登录后投票
   发表时间:2013-07-28  
麻烦楼主说下泛型Bean的目的,除了少写二行代码还能咋地
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics