異常
[org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler 95 handleError] - Unexpected error occurred in scheduled task. java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Integer
at com.auto.async.AutoDashboard.sendSubReport(AutoDashboard.java:506) ~[classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_171]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_171]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_171]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_171]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) ~[spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) ~[spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:741) ~[spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) ~[spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at com.auto.async.AutoDashboard$$EnhancerBySpringCGLIB$$b3bebd01.sendSubReport(<generated>) ~[classes/:?]
at com.auto.async.AutoRunSub.runSubDashBoard(AutoRunSub.java:69) ~[classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_171]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_171]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_171]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_171]
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) [spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) [spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_171]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_171]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_171]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_171]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_171]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_171]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_171]
重點異常內容是:
Unexpected error occurred in scheduled task. java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Integer
對應代碼:
//定義的SQL接口方法
@Select("SELECT SUM(weekTimes) AS 'times', SUM(weekErrTimes) AS 'errTimes', SUM(weekDelay) AS 'delay', SUM(recordLen) AS 'recordLen' FROM dashboard WHERE proId=#{proId}")
Map<String, Integer> getProAllErrSub(@Param(value = "proId") int proId);
//應用對應的接口方法
A: Map<String, Integer> subs = managerDashboard.getProAllErrSub(pro.getId());
B: int recordLen = Integer.parseInt(subs.get("recordLen").toString()); // 就是這裏報錯
分析
因爲A代碼在執行過程中沒有報錯,但是在B執行的是否沒有報錯(前提是有數據的),這時候從異常上看,還是數據類型有問題,BigDecimal
不能轉Integer
,並不能說明B處的代碼有問題,通過了解才知道,MyBatis查詢出來的數據默認都是BigDecimal
,所以在接收SELECT
數據的是否就不能用Integer
類型,而是用BigDecimal
,所以修改SQL接口方法返回類型。(BigDecimal
不能直接轉換爲Integer
類型)
正確代碼
//定義的SQL接口方法
@Select("SELECT SUM(weekTimes) AS 'times', SUM(weekErrTimes) AS 'errTimes', SUM(weekDelay) AS 'delay', SUM(recordLen) AS 'recordLen' FROM dashboard WHERE proId=#{proId}")
Map<String, BigDecimal> getProAllErrSub(@Param(value = "proId") int proId);
//應用對應的接口方法
A: Map<String, BigDecimal> subs = managerDashboard.getProAllErrSub(pro.getId());
B: int recordLen = Integer.parseInt(subs.get("recordLen").toString());