这两天继续联调,做一些细节的修改,总体来讲问题不大。总结如下:踩了一个坑,学到了数据库回滚。
这个项目有一个中间层服务,前端的请求在中间层会被处理一下,然后转发到我的Java
服务。中间层主要是校验用户登录状态和处理用户登录信息。结果发现中间层在处理参数的时候,默认都都转成了Unicode
编码格式的字符串了。这个说法可能用词有些不当,就是前段传的参数是测试
,我收到的参数是\u6d4b\u8bd5
,而且是utf-8
编码格式的字符串。我有点迷,找了半天问题,虽然不知道为啥这么做,但是数据库里面确实正常的。中间层服务是Python
的,大概是Python
语言的习惯吧。
我收到的参数:
跳过中间层,从前端直接发请求到我的服务上时参数如下:
上网抄了一个解决方案:
/**
* 处理Unicode码转成utf-8
*
* @param str
* @return
*/
public static String unicodeToString(String str) {
Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
Matcher matcher = pattern.matcher(str);
char ch;
while (matcher.find()) {
String group = matcher.group(2);
ch = (char) Integer.parseInt(group, 16);
String group1 = matcher.group(1);
str = str.replace(group1, ch + Constant.EMPTY);
}
return str;
}
这个实现比较简单,增加一个注释即可,刚好是用到了就搜了一下。在某些场景下,一个数据库事务分成了好几个步骤,如果中间出现异常中断,则将之前已经执行的数据库操作回滚。比如:我新建了一条测试用例之后,需要创建一条用例编辑记录,然后把用例的关联关系保存到另外一张表里面。如果在保存用例关系时候发现错误,比如关联失败,则需要把记录和用例都删除,返回相应错误码。
具体实现方案是在service
类增加rollbackFor
注解即可,如下:
@Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
当然可以用在判断结果上,比如关联项目已经过期或者无权操作时,可以抛出一个自定义异常。
@Override
public int addUser(EditUserBean user) {
int add = testUserMapper.addUser(user);
if (add == 1) {
TestUserCheckBean userCheckBean = new TestUserCheckBean();
userCheckBean.copyFrom(user);
TestUserCheckBean bean = new TestUserCheckBean();
int i = updateUserStatus(userCheckBean);
if (i != 1 || StringUtils.isEmpty(userCheckBean.getCertificate())) {
UserStatusException.fail(TestUserCode.CHECK_FAIL.getDesc());
}
} else {
UserStatusException.fail(TestUserCode.ADD_USER_FAIL.getDesc());
}
return user.getId();
}