其他錯誤:org.apache.shiro.authc.AuthenticationException
前言
博主今天遇到了一個驚天大bug!原本我的程式碼是沒有問題的,但是當我把mybatis的資料庫連線配置從本地改為遠端測試庫之後,登入便會報錯。使用Navicat可以遠端連線資料庫!mybatis的連線配置也沒有問題,Tomcat伺服器可以正常啟動!專案框架是spring+spring MVC+mybatis。
一、登入賬號報其他錯誤:org.apache.shiro.authc.AuthenticationException
網上查詢資料很多是說身份驗證或者許可權校驗等等有問題。但是博主敢肯定我的程式碼是沒有問題的,因為使用本地庫的時候能夠正常操作!所以身份驗證和許可權校驗等配置不會有問題。
二、控制檯報錯
由於不確定是不是登入的時候執行語句有問題,所以我將查詢語句列印在控制檯。要在mybatis的configuration.xml配置檔案中加上<setting name="logImpl" value="STDOUT_LOGGING" />
,這樣sql語句就能在控制檯顯示出來。
可以看到報錯有兩個,我對這兩種報錯都進行了查詢
1.報錯:SqlSession [[email protected]] was not registered for synchronization because synchronization is not active
參考
2.報錯: [[email protected]] will not be managed by Spring
參考這篇部落格,有人說是Spring沒有去管理資料庫的事務,但是我用本地庫都是正常的,所以spring或者spring MVC的配置都是正確的。
既然這兩條報錯資訊的解決辦法都不是我想要的,那麼接著往下看控制檯的列印語句,是sql語句。完整的sql語句是:
==> Preparing: select USER_ID as userId, USER_NAME as username, PASSWORD as password, ADMINISTRATOR as administrator, PASSWORD_CHANGED as passwordChanged from T_SC_ADMIN_USER WHERE USER_NAME = ?
==> Parameters: admin(String)
但是在輸入admin引數進行查詢之後竟然關閉了會話!正常的查詢結果應該如下:
<== Columns: userId, username, password, administrator, passwordChanged
<== Row: 1, admin, e10adc3949ba59abbe56e057f20f883e, 1, 1
<== Total: 1
問題到了這裡就比較明瞭了,應該是sql查詢出現了問題。我將那行select語句放入Navicat裡,將‘admin‘替換?,進行查詢,結果是[Err] 1146 - Table '資料庫.T_SC_ADMIN_USER' doesn't exist
(預設在表前加上了資料庫名稱,不知為何)。也就是說我的表不存在,但那是不可能的!我的資料庫中有t_sc_admin_user這張表,唯一的區別就是大小寫。我將表名改成小寫,查詢成功!又測試了其他幾條sql語句,結果一樣!大寫出錯,小寫成功。
現在問題已經找到了,就是表名大小寫造成的。使用mysql的表名/欄位名/欄位值是否區分大小寫這篇部落格裡的方法,在Navicat分別在本地庫和遠端庫的新建查詢執行show Variables like '%table_names'
語句,得出的結果分別是1和0。也就是說我本地資料庫是不區分大小寫而遠端庫是區分大小寫的。我去問了建遠端庫的同事,由於是在Linux上建立的,所以預設是區分大小寫。到現在,問題解決了,就是MySQL資料庫區分了大小寫導致查詢失敗!,只需要把遠端庫修改成不區分大小寫就可以了。
結語
有的時候執行程式碼報錯並不一定是報錯語句的那個意思,需要找到更深層的原因。像這裡報錯是org.apache.shiro.authc.AuthenticationException,但其實是登入的時候查詢語句出錯,而出錯原因則是MySQL資料庫區分大小寫。