spring mvc中针对xml的classtobebound的改善类

  在spring mvc中,如果要输出xml,则其中一个方法是

<beans>
    <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="classesToBeBound">
            <list>
                <value>org.springframework.oxm.jaxb.Flight</value>
                <value>org.springframework.oxm.jaxb.Flights</value>
            </list>
        </property


  如果类太多,要逐个增加到classTobBeBound外,十分麻烦,因此可以这样做:


public class ClasspathScanningJaxb2Marshaller extends Jaxb2Marshaller {
    private static final Logger log = LoggerFactory
            .getLogger(ClasspathScanningJaxb2Marshaller.class);

    private List<String> basePackages;

    public List<String> getBasePackages() {
        return basePackages;
    }

    public void setBasePackages(List<String> basePackages) {
        this.basePackages = basePackages;
    }

    @PostConstruct
    public void init() throws Exception {
        setClassesToBeBound(getXmlRootElementClasses());
    }

    private Class<?>[] getXmlRootElementClasses() throws Exception {
        ClassPathScanningCandidateComponentProvider scanner =
                new ClassPathScanningCandidateComponentProvider(false);
        scanner.addIncludeFilter(new AnnotationTypeFilter(XmlRootElement.class));

        List<Class<?>> classes = new ArrayList<Class<?>>();
        for (String basePackage : basePackages) {
            Set<BeanDefinition> definitions = scanner.findCandidateComponents(basePackage);
            for (BeanDefinition definition : definitions) {
                String className = definition.getBeanClassName();
                log.info("Found class: {}", className);
                classes.add(Class.forName(className));
            }
        }

        return classes.toArray(new Class[0]);
    }

}



  使用方法,在配置文件中,比如spring-mvc.xml中
<!-- XML视图 -->
	<bean id="marshallingView"
		class="org.springframework.web.servlet.view.xml.MarshallingView">
	    <constructor-arg>
                <bean class="com.itownet.isms.core.mapper.ClasspathScanningJaxb2Marshaller">
                    <property name="basePackages">
                        <list>
                            <value>com.abc.model</value>
                        </list>
                    </property>
                </bean>
            </constructor-arg>
	</bean>

   则在对应的xml解析器中,注入刚才的类,其中配置需要解析的xml的实体类所在的包,
这里用basePackage指定

你可能感兴趣的:(spring mvc中针对xml的classtobebound的改善类)