mybatis插⼊含有美元符号($)字符串报
java replace方法java.lang.IndexOutOfBou。。。
⼀:问题描述:
在springboot-security框架⽣成BCryptPasswordEncoder()⽅法⽣成加密后的密码后,带有$符号,导致新增⽤户的时候插⼊不了,报(IndexOutOfBoundsException: No group 2)的错误!
⾕歌⼀下 java.lang.IndexOutOfBoundsException: No group 这个错误会发现是 place⽅法出现反斜杠\或美元符号$时会出现这个异常,
⼆:出现问题的原因:
MyBatis直接插⼊含有$符号的字符串是可以的!
我在项⽬中⾃定义了⼀个mybatis的分页插件,所以实现了mybaits的Interceptor接⼝!在mybatis的实现类中,为了拼接sql字符串,调⽤了replace这个⽅法,如下:
sql = placeFirst("\\?", youString);
以此来完成,数据库的sql语句拼写!把"insert into sys_user(id,created_time,modified_time,remark,login_name,password,status) values(?,?,?,?,?, ? ,?)";中的"?"替换成对应的实体对象值!
由于通过BCryptPasswordEncoder().encode加密后的密码是:$2a$10$9zXJY.gYiv2A6ay0pAMLzONOLswRaHSrbb8VZWW7O7K5aPlvraOfq 这样的字符串!⾥⾯还有$符号,导致调⽤
jdk(1.5以后)⾥⾯的⽅法
包中的Matcher.quoteReplacement()来进⾏字符串的转义!
三:解决的办法是:
所以只需要把替换的⽅法改成如下就可以了!
sql = placeFirst("\\?", 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);
}
String();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论