美文网首页
springboot国际化形式处理restful接口中的mess

springboot国际化形式处理restful接口中的mess

作者: Geroge1226 | 来源:发表于2020-06-17 13:42 被阅读0次

    1、背景:

    项目中使用到第三方厂商系统接口,他们业务校验message均是以英文形式返回,如:"illegal.coupon.code"。而这样的提示,对C端用户来讲不友好,业务要求映射成中文,前面开发同事,使用暴力转换。类似于此场景均提示用户:"处理失败"。这样方式也不友好,经手项目后,想到用国际化(i18n)方式来处理,如下:

    2、步骤

    • 项目resouces下新建Resource Bundle文件,如下:


      image.png

    config-message.properties中内容如下:

    illegal.coupon.code = 非法的券码
    this.coupon.code.has.been.used = 券码已经被使用
    this.coupon.code.has.expired = 券码已经过期
    this.coupon.has.expired = 券已经过期
    this.coupon.has.been.invalidated = 券已经作废
    this.coupon.is.binding.now = 券码正在绑定,请勿重复提交
    fail.to.bind.coupon.code = 绑定券码失败,请联系客服
    find.userCoupon.detail.fail =  查询用户优惠券详情失败
    the.receive.coupon.isNull = 转赠失败,转赠券不存在
    coupon.refund.failed = 券信息查询失败
    this.userCoupon.isNot.handsel.coupon = 非转赠优惠券
    this.userCoupon.quantity.isZero = 该转赠券数量为0
    this.userCoupon.is.expired = 优惠券已过期
    create.userCouponHandselLog.failed =创建会员转赠记录失败
    user.coupon.is.not.exists=用户券信息不存在
    
    • 消息绑定配置
    @Configuration
    public class ProjectConfig {
    
        @Bean(value = "configMessage")
        public MessageSource messageSource(){
            ResourceBundleMessageSource  messageSource = new ResourceBundleMessageSource();
            messageSource.setDefaultEncoding("UTF-8");
            // config-message 是 bundle-sourece路径:从source目录下找的
            messageSource.setBasename("config-message");
            return messageSource;
        }
    }
    
    • 全局捕获异常
    @Component
    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @Autowired
        @Qualifier("configMessage")
        private MessageSource msgSource;
    
        @ResponseBody
        @ExceptionHandler(CustomException.class)
        public UniformResultTemplate<Object> handleCustomException(CustomException customException) {
            if (customException == null) {
                return new UniformResultTemplate<>(Code.SYS_ERROR.getCode(), Code.SYS_ERROR.getDesc());
            }
            customException.printStackTrace();
            String message = StringUtils.isEmpty(getMessage(customException.getMsg()))?customException.getMsg():getMessage(customException.getMsg());
            String code = StringUtils.isEmpty(customException.getCode()) ? Code.FAIL.getCode():customException.getCode();
            return new UniformResultTemplate<>(code, message);
        }
    
        public String getMessage(String message){
            return msgSource.getMessage(message,null, LocaleContextHolder.getLocale());
        }
    }
    
    • 业务使用地方
     if (baseResponse.isSuccess()) {
             returnbaseResponse.getResult();
     } else {
            throw new CustomException(baseResponse.getCode(), baseResponse.getError());
     }
    
    • 效果:
    {
      "code": "10001",
      "message": "券码已经被使用",
      "result": null,
      "totalTimes": null,
      "interfaceTimes": null
    }
    

    3、技术原理

    后续补...

    相关文章

      网友评论

          本文标题:springboot国际化形式处理restful接口中的mess

          本文链接:https://www.haomeiwen.com/subject/qexsxktx.html