• 我的开发日记(十二)


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

    坑:又是字符编码

    这个项目有一个中间层服务,前端的请求在中间层会被处理一下,然后转发到我的Java服务。中间层主要是校验用户登录状态和处理用户登录信息。结果发现中间层在处理参数的时候,默认都都转成了Unicode编码格式的字符串了。这个说法可能用词有些不当,就是前段传的参数是测试,我收到的参数是u6d4bu8bd5,而且是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();
        }
    
    

    • 公众号FunTester首发,更多原创文章:FunTester410+原创文章,欢迎关注、交流,禁止第三方擅自转载。

    热文精选

  • 相关阅读:
    Basic Calculator II
    理解与模拟一个简单servlet容器
    括号字符串有效性验证
    理解与模拟一个简单web服务器
    Tomcat日志输出在linux和windows差异
    SqlCommand执行带GO的SQL脚本文件
    《第一行代码》添加百分比布局库依赖问题
    final 和 static之间的区别和联系
    oracle DB 使用注意点小结
    方法重载(method overloading)
  • 原文地址:https://www.cnblogs.com/FunTester/p/13231494.html
Copyright © 2020-2023  润新知