mybatis 插入 含有美元符號($) 字符串 報 java.lang.IndexOutOfBoundsException: No group 2 的問題


 

  一:問題描述:

    在springboot-security框架生成BCryptPasswordEncoder()方法生成加密后的密碼后,帶有$符號,導致新增用戶的時候插入不了,報(IndexOutOfBoundsException: No group 2)的錯誤!

  谷歌一下 java.lang.IndexOutOfBoundsException: No group  這個錯誤會發現是 String.replace方法出現反斜杠\或美元符號$時會出現這個異常,

  二:出現問題的原因:

  MyBatis直接插入含有$符號的字符串是可以的!

  我在項目中自定義了一個mybatis的分頁插件,所以實現了mybaits的Interceptor接口!在mybatis的實現類中,為了拼接sql字符串,調用了replace這個方法,如下:

 sql = sql.replaceFirst("\\?", youString);

  以此來完成,數據庫的sql語句拼寫!把"insert into sys_user(id,created_time,modified_time,remark,login_name,password,status) values(?,?,?,?,?, ? ,?)";中的"?"替換成對應的實體對象值!

  由於通過BCryptPasswordEncoder().encode加密后的密碼是:$2a$10$9zXJY.gYiv2A6ay0pAMLzONOLswRaHSrbb8VZWW7O7K5aPlvraOfq 這樣的字符串!里面還有$符號,導致調用

String.replace的方法時候 報錯,因為含有特殊字符,replace無法替換。所以需要對字符串進行轉義!可以自己寫方法,也可以調用jdk(1.5以后)里面的方法

java.util.regex包中的Matcher.quoteReplacement()來進行字符串的轉義!

三:解決的辦法是:
所以只需要把 替換的方法改成如下 就可以了!
sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(youString));

  其中quoteReplacement方法的源碼是源碼是:

  

public static String quoteReplacement(String s) {
        if ((s.indexOf('\\') == -1) && (s.indexOf('$') == -1))
            return s;
        StringBuilder sb = new StringBuilder();
        for (int i=0; i<s.length(); i++) {
            char c = s.charAt(i);
            if (c == '\\' || c == '$') {
                sb.append('\\');
            }
            sb.append(c);
        }
        return sb.toString();
    }

  




 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM