加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

一个项目的SpringCloud微服务改造过程

发布时间:2019-08-07 23:34:41 所属栏目:建站 来源:黄玲峰
导读:SSO是公司一个已经存在了多少年的项目,后端回收SpringMVC、MyBatis,数据库行使MySQL,前端展示行使Freemark。本年,我们对该项目举办了一次革命性的改造,将其改革成SpringCloud架构,而且把前后端疏散,前端回收Vue框架。 一、行使SpringCloud架构举办

一样平常编码时有非常我们城市try-catch捕捉非常,偶然为了区分差异的非常还会一次catch多个非常,大量的try-catch语句,这样使得代码也不足优雅;一个沟通的非常处理赏罚写多次代码也较量冗余,以是引入全局的非常处理赏罚很是须要。
改革前的非常处理赏罚设置文件:

  1. <!--界说非常处理赏罚页面--> 
  2. <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
  3.         <property name="exceptionMappings"> 
  4.             <props> 
  5.                 <prop key="com.creditease.permissionapi.exception.NopermissionException">/permission/noSecurity</prop> 
  6.             </props> 
  7.         </property> 
  8.  </bean> 

行使SimpleMappingExceptionResolver类处理赏罚非常,配置自界说非常范例NopermissionException,以及非常产生后的哀求路径/permission/noSecurity。

SpringBoot中回收@RestControllerAdvice可能@ControllerAdvice配置全局非常类。这两者区别相同于@Controller和@RestController注解。
SSO中界说了三种全局的非常处理赏罚:平凡的Exception处理赏罚;自定的NopermissionException非常和参数校验非常。

全局非常处理赏罚代码如下:

  1. @Configuration 
  2. @Slf4j 
  3. @RestControllerAdvice 
  4. public class GlobalExceptionConfig { 
  5. //无权限处理赏罚 
  6. @ExceptionHandler(value = {NopermissionException.class}) 
  7. public void noPermissionExceptionHandler(HttpServletRequest request, Exception ex, HttpServletResponse response, @Value("${sso.server.prefix}") String domain) throws IOException { 
  8. printLog(request,ex); 
  9. response.sendRedirect("跳转到无权限页面地点"); 
  10.  
  11. //参数校验处理赏罚 
  12. @ExceptionHandler(value = {BindException.class}) 
  13. public ResultBody BindExceptionHandler(BindException bindException){ 
  14. List<ObjectError> errors = bindException.getBindingResult().getAllErrors(); 
  15. //这个ResultBody是一个返回功效工具,这里必要返回json,内里包括了状态码和提醒信息 
  16. return ResultBody.buildFailureResult(errors.get(0).getDefaultMessage()); 
  17.  
  18. //全部未捕捉的非常处理赏罚逻辑 
  19. @ExceptionHandler(value = {Exception.class}) 
  20. public ResultBody exceptionHandler(HttpServletRequest request,Exception ex){ 
  21. printLog(request,ex); 
  22. return ResultBody.buildExceptionResult(); 
  23.  
  24. //将哀求参数和非常打印出来,团结@slf4j注解 
  25. public void printLog(HttpServletRequest request,Exception ex){ 
  26. String parameters = JsonHelper.toString(request.getParameterMap()); 
  27. log.error("url>>>:{},params>>>:{} ,printLog>>>:{}",request.getRequestURL(),parameters,ex); 
  28.  

@RestControllerAdvice团结@Validation,可以对Bean举办校验,校验不通过会抛出BindException非常。通过注解可以少写if-else代码,判定哀求的接口参数是否为空,进步代码的雅观性。譬喻:

  1.  //通例做法 
  2.     if(StringUtils.isEmpty(ssoSystem.getSysCode()) 
  3. //SSO做法 
  4. //在Controller哀求要领上添加@Valid注解 
  5. @RequestMapping(value = "/add", method = RequestMethod.POST) 
  6. public ResultBody add(@Valid @RequestBody SsoSystem ssoSystem) { 
  7.  
  8.  
  9. //在必要处理赏罚的SsoSystem Bean的属性上加@NotNull注解 
  10. @NotNull(message = "体系编号不能为空") 
  11. private String sysCode;

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读