这几天在写项目中的支付模块。首先写的是支付宝。官方的文档和demo给的很详细,写起来也得心应手。但是这两天遇到这么一个问题。
支付宝支付的一些网关和密钥,全部写在了配置文件里。然后通过spring-mybatis直接注入到JavaBean中。但是调用的时候,发现几个参数为null。
spring-mybatis.xml 配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <!-- 引入配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <!-- 这里支持多种寻址方式:classpath和file --> <value>classpath:jdbc.properties</value> <value>classpath:redis.properties</value> <value>classpath:application.properties</value> <value>classpath:ftp.properties</value> <value>classpath:rtiRedis.properties</value> <value>classpath:remoteService.properties</value> <value>classpath:aliPayConfig.properties</value> </list> </property> </bean> <!-- 支付宝参数 开始--> <bean id="payService" class="com.cqut.service.pay.impl.PayService"> <property name="appId" value="${alipay.appid}"></property> <property name="rsa2Private" value="${alipay.privateRsa2}"></property> <property name="aliPayPublic" value="${alipay.alipayPublicRsa2}"></property> <property name="gateway" value="${alipay.gateway}"></property> </bean> <!-- 支付宝参数 结束 -->
|
Service的部分代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| private String appId; private String gateway; private String rsa2Private; private String aliPayPublic;
public void setGateway(String gateway) { this.gateway = gateway; }
public void setAppId(String appId) { this.appId = appId; }
public void setRsa2Private(String rsa2Private) { this.rsa2Private = rsa2Private; }
public void setAliPayPublic(String aliPayPublic) { this.aliPayPublic = aliPayPublic; }
|
然后调试的时候,在项目启动的时候,上述set方法都执行了,PayService类中参数也有对应的值。
但是在调用方法的时候,却发现参数全部为null。
然后我就有所不解,没有想明白为什么会这样。
因为Spring初始化的时候,值已经写入了。但是为什么调用的时候为null呢?
又查看了代码,没有重新赋值为null的方法。
那么说明一定有一个地方将PayService参数初始化了。
那么就很有意思了。 那应该就是Spring又初始化了一次这个类?
有了基本的思路,然后就可以找问题了。 我将@Service注解去掉。再次尝试,发现可以了
1 2
| public class PayService implements IPayService{
|
然后再想了一下。大概明白了为什么会发生这种问题了。
我在spring-mybatis.xml中给该类配置的JavaBean,Spring在初始化的时候,加载了一次,将值传了进去。然后类上有@Service注解,我们在spring-mybatis.xml配置了自动扫描。
1 2
| <!-- 自动扫描 --> <context:component-scan base-package="com.cqut" />
|
然后我们在通过PayController调用PayService方法的时候,Spring又加载了一次该类,这次将Spring初始化加载时的JavaBean覆盖掉了。
而这次没有将配置文件中的值写入到类的参数中。
去掉@Service注解后。Spring只在初始化的时候加载了一次,下次直接调用,没有覆盖,自然不为null啦~