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、技术原理
后续补...
网友评论