【问题标题】:Ant task for Spring Validation用于 Spring 验证的 Ant 任务
【发布时间】:2011-08-17 09:53:42
【问题描述】:

我需要一个 ANT 任务来验证 spring 配置。我需要在运行前的构建时发现问题吗?例如,在 spring 上下文文件中包含一个属性一个 bean,但是这个 bean 没有这个属性。 在 Eclipse 中,有一个工具 Spring Explorer 可以进行此验证。

谢谢,

org.springframework.web.context.ContextLoaderListener failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'readController' defined in class path resource [applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'productOperations' of bean class [com.bee.view.json.ReadController]: Bean property 'productOperations' is not writable or has an invalid setter method

setter的参数类型和getter的返回类型是否匹配?

【问题讨论】:

    标签: spring ant validation


    【解决方案1】:

    确保上下文有效的一种简单方法是创建一个加载上下文的 JUnit 测试。使用 spring-test.jar 支持类可以轻松实现:

    public class MyTest extends AbstractDependencyInjectionSpringContextTests {
    
        // this will be injected by Spring
        private QueryDao queryDao;
        private MyBusinessObject myBusinessObject;
    
        // ensure that spring will inject the objects to test by name
        public MyTest () {
            setAutowireMode(AUTOWIRE_BY_NAME);
        }
    
        @Override
        protected String[] getConfigLocations() {
            return new String[] { "applicationContextJUnit.xml" };
        }
    
        public void testQueryDao() {
            List<SomeData> list = queryDao.findSomeData();
            assertNotNull(list);
            // etc
        }
    
        public void testMyBusinessObject() {
            myBusinessObject.someMethod();
        }
    
        public void setQueryDao(QueryDao queryDao) {
            this.queryDao = queryDao;
        }
    }
    

    加载在 Web 应用程序中使用的上下文的问题是 JUnit 不一定可以访问相同的资源(例如 JNDI 数据源),所以如果您的“applicationContext.xml”中有以下内容:

    <beans ...>
        <bean id="myBusinessObject" class="com.test.MyBusinessObject">
            <property name="queryDao" ref="queryDao"/>
        </bean>
    
        <bean id="queryDao" class="com.test.QueryDao">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <jee:jndi-lookup
              id="dataSource" 
              jndi-name="jdbc/mydatasource" 
              resource-ref="true" 
              cache="true" 
              lookup-on-startup="false"
              proxy-interface="javax.sql.DataSource"/>
    </beans>
    

    您的“applicationContextJUnit.xml”将导入您的“真实”应用程序上下文并重新定义资源:

    <beans ...>
        <import resource="classpath:applicationContext.xml"/>
    
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
            <property name="url" value="jdbc:oracle:thin:..."/>
            <property name="username" value="scott"/>
            <property name="password" value="tiger"/>
        </bean>
    </beans>
    

    这样,您的单元测试将加载应用程序上下文(即使是您未在单元测试中明确测试的应用程序上下文),并且您可以确信您的上下文是正确的,因为 Spring 本身已加载它。如果出现错误,则单元测试将失败。

    【讨论】:

    • 为每个 bean 编写一个测试类的成本很高。
    • 正如我所提到的,你不需要为每个 bean 编写一个测试用例,如果你只有一个测试用例,那么应用程序上下文中的所有 bean 都将被加载(除了我认为定义为惰性的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多