mybatis 插入 含有美圆符号($) 字符串 报 java.lang.IndexOutOfBoundsException: No group 2 的问题

 

  一:问题描述:java

    在springboot-security框架生成BCryptPasswordEncoder()方法生成加密后的密码后,带有$符号,致使新增用户的时候插入不了,报(IndexOutOfBoundsException: No group 2)的错误!spring

  谷歌一下 java.lang.IndexOutOfBoundsException: No group  这个错误会发现是 String.replace方法出现反斜杠\或美圆符号$时会出现这个异常,sql

  二:出现问题的缘由:数据库

  MyBatis直接插入含有$符号的字符串是能够的!springboot

  我在项目中自定义了一个mybatis的分页插件,因此实现了mybaits的Interceptor接口!在mybatis的实现类中,为了拼接sql字符串,调用了replace这个方法,以下:mybatis

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

  以此来完成,数据库的sql语句拼写!把"insert into sys_user(id,created_time,modified_time,remark,login_name,password,status) values(?,?,?,?,?, ? ,?)";中的"?"替换成对应的实体对象值!app

  因为经过BCryptPasswordEncoder().encode加密后的密码是:$2a$10$9zXJY.gYiv2A6ay0pAMLzONOLswRaHSrbb8VZWW7O7K5aPlvraOfq 这样的字符串!里面还有$符号,致使调用框架

String.replace的方法时候 报错,由于含有特殊字符,replace没法替换。因此须要对字符串进行转义!能够本身写方法,也能够调用jdk(1.5之后)里面的方法ui

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();
    }
相关文章
相关标签/搜索