1. 程式人生 > >Java踩坑記錄

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