1.quartz整合spring框架service层对象注入为null解决方案
JobDetailFactoryBean中注入的是一个cn.itcast.quartz.HelloJob实现类的全路径,底层会反射创建出一个HelloJob的对象,但是该对象不是由spring管理的,所以业务层的对象无法注入。
办法:
JobFactoryService
public class JobFactoryService extends AdaptableJobFactory { protected static Logger logger = LoggerFactory.getLogger(JobFactoryService.class); @Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { Object jobInstance = super.createJobInstance(bundle); capableBeanFactory.autowireBean(jobInstance); return jobInstance; } }
spring-quartz.xml
<?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:context ="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 1:定义任务的bean ,这里使用JobDetailFactoryBean,也可以使用MethodInvokingJobDetailFactoryBean ,配置类似--> <bean name="demoJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- 指定job的名称 --> <property name="name" value="demoJob"/> <!-- 指定job的分组 --> <property name="group" value="demo_group"/> <!-- 指定具体的job类 --> <property name="jobClass" value="com.maimob.finsys.job.MessageCenterJob"/> <!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中会删除该任务 --> <property name="durability" value="true"/> <!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 --> <property name="applicationContextJobDataKey" value="applicationContext"/> </bean> <!-- 2.2:定义触发器的bean,定义一个Cron的Trigger,一个触发器只能和一个任务进行绑定 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 指定Trigger的名称 --> <property name="name" value="hw_trigger"/> <!-- 指定Trigger的名称 --> <property name="group" value="hw_trigger_group"/> <!-- 指定Tirgger绑定的Job --> <property name="jobDetail" ref="demoJob"/> <!-- 指定Cron 的表达式 ,当前是每隔600s运行一次 --> <property name="cronExpression" value="0/10 * * * * ?" /> </bean> <bean id="jobFactoryService" class="com.maimob.finsys.job.JobFactoryService"/> <!-- 3.定义调度器,并将Trigger注册到调度器中 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="jobFactory" ref="jobFactoryService"/> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> <!-- <property name="autoStartup" value="true" /> --> </bean> </beans>
2.AES加密在项目中加密中文解密出来后就是乱码,但是用test类写就没问题,这个原因应该是项目的编码造成的
办法:getBytes("utf-8")
两次踩,IDEA中要设置otherSettings->default Settings中字符编码
public static String encrypt(String sSrc, String sKey) throws Exception {
SecretKeySpec skeySpec = create128BitsKey(sKey);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"
IvParameterSpec iv = create128BitsIV(sKey);//使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
return Base64Utils.encode(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
}
3.批量更新sql报错
数据源加上 allowMultiQueries=true
4.aop和事务同时使用
在使用数据源切换和事务时,必须要指定order,在事务之前进行数据源的切换,不然会造成切换数据源出错
6.想要获取mybatis中Update为实际影响的条数要在数据源加上useAffectedRows=true,否则update返回的是匹配条数而不是影响条数