Java踩坑記錄
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返回的是匹配條數而不是影響條數