这两天继续联调,做一些细节的修改,总体来讲问题不大。总结如下:踩了一个坑,学到了数据库回滚。

坑:又是字符编码

这个项目有一个中间层服务,前端的请求在中间层会被处理一下,然后转发到我的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();
}


热文精选


↙↙↙阅读原文可查看相关链接,并与作者交流