昨天我也遇到类似楼主说的Spring找不到被调用method的情况,把我吓了一跳:因为昨天运行的时候都没有出现这个问题。检查发现我在被调用的函数多加了一个参数,觉得可能是这个引起的问题。我查看了Spring的MethodInvoker的源代码,验证了我的想法。
java代码: 
        public void prepare() throws ClassNotFoundException, NoSuchMethodException {
                …
                if (this.arguments == null) {
                        this.arguments = new Object[0];
                }
                Class[] argTypes = new Class[this.arguments.length];
                for (int i = 0; i < this.arguments.length; ++i) {
                        argTypes[i] = (this.arguments[i] != null ? this.arguments[i].getClass() : Object.class);
                }
                // Try to get the exact method first.
                try {
                        this.methodObject = this.targetClass.getMethod(this.targetMethod, argTypes);
                }
                catch (NoSuchMethodException ex) {
                        // Just rethrow exception if we can’t get any match.
                        this.methodObject = findMatchingMethod();
                        if (this.methodObject == null) {
                                throw ex;
                        }
                }
                …
        }

而在Spring的配置中Job的定义是:

 

 

XML代码: 
<bean id=”settlementJob” class=”org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean“>
                <property name=”targetObject” ref=”settlementBizFacade”/>
                <property name=”targetMethod” value=”doSettlement”/>
                <property name=”concurrent” value=”false
“/>
                <property name=”name” value=”settlement”/>
</bean>

被调用的targetObject的接口

 

 

java代码: 
public interface SettlementBizFacade {       
        void doSettlement(UserDto byUser);        //原来是doSettlement()
        …
}

可以看到由于没有设置arguments,所以Spring会在启动时去找不带参数的doSettlement方法,所以肯定找不到,在启动的时候就会报错。
如果一定要这样要调用这个函数,必须设置arguments, Spring会根据arguments的Class来找被调用方法。
所以我在我的接口中多加了一个“doSettlement()”方法……. -_-!

评论联播

Your email address will not be published. Required fields are marked *