当前位置: 首页 > news >正文

甘肃省环保建设申报网站ps软件入门教程

甘肃省环保建设申报网站,ps软件入门教程,网站开发公司赚钱么,怎么做网站推广怀化SpringBoot接口如何对异常进行统一封装#xff0c;并统一返回呢#xff1f;以上文的参数校验为例#xff0c;如何优雅的将参数校验的错误信息统一处理并封装返回呢#xff1f;为什么要优雅的处理异常如果我们不统一的处理异常#xff0c;经常会在controller层有大量的异常…SpringBoot接口如何对异常进行统一封装并统一返回呢以上文的参数校验为例如何优雅的将参数校验的错误信息统一处理并封装返回呢为什么要优雅的处理异常如果我们不统一的处理异常经常会在controller层有大量的异常处理的代码 比如Slf4j Api(value User Interfaces, tags User Interfaces) RestController RequestMapping(/user) public class UserController {/*** http://localhost:8080/user/add .** param userParam user param* return user*/ApiOperation(Add User)ApiImplicitParam(name userParam, type body, dataTypeClass UserParam.class, required true)PostMapping(add)public ResponseEntityString add(Valid RequestBody UserParam userParam) {// 每个接口充斥着大量的异常处理try {// do something} catch(Exception e) {return ResponseEntity.fail(error);}return ResponseEntity.ok(success);} }那怎么实现统一的异常处理特别是结合参数校验等封装实现案例简单展示通过ControllerAdvice进行统一异常处理。ControllerAdvice异常统一处理对于400参数错误异常Slf4j RestControllerAdvice public class GlobalExceptionHandler {/*** exception handler for bad request.** param e* exception* return ResponseResult*/ResponseBodyResponseStatus(code HttpStatus.BAD_REQUEST)ExceptionHandler(value { BindException.class, ValidationException.class, MethodArgumentNotValidException.class })public ResponseResultExceptionData handleParameterVerificationException(NonNull Exception e) {ExceptionData.ExceptionDataBuilder exceptionDataBuilder ExceptionData.builder();log.warn(Exception: {}, e.getMessage());if (e instanceof BindException) {BindingResult bindingResult ((MethodArgumentNotValidException) e).getBindingResult();bindingResult.getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).forEach(exceptionDataBuilder::error);} else if (e instanceof ConstraintViolationException) {if (e.getMessage() ! null) {exceptionDataBuilder.error(e.getMessage());}} else {exceptionDataBuilder.error(invalid parameter);}return ResponseResultEntity.fail(exceptionDataBuilder.build(), invalid parameter);}}对于自定义异常/*** handle business exception.** param businessException* business exception* return ResponseResult*/ ResponseBody ExceptionHandler(BusinessException.class) public ResponseResultBusinessException processBusinessException(BusinessException businessException) {log.error(businessException.getLocalizedMessage(), businessException);// 这里可以屏蔽掉后台的异常栈信息直接返回business errorreturn ResponseResultEntity.fail(businessException, businessException.getLocalizedMessage()); }对于其它异常/*** handle other exception.** param exception* exception* return ResponseResult*/ ResponseBody ExceptionHandler(Exception.class) public ResponseResultException processException(Exception exception) {log.error(exception.getLocalizedMessage(), exception);// 这里可以屏蔽掉后台的异常栈信息直接返回server errorreturn ResponseResultEntity.fail(exception, exception.getLocalizedMessage()); }Controller接口接口中无需处理异常Slf4j Api(value User Interfaces, tags User Interfaces) RestController RequestMapping(/user) public class UserController {/*** http://localhost:8080/user/add .** param userParam user param* return user*/ApiOperation(Add User)ApiImplicitParam(name userParam, type body, dataTypeClass UserParam.class, required true)PostMapping(add)public ResponseEntityUserParam add(Valid RequestBody UserParam userParam) {return ResponseEntity.ok(userParam);} }运行测试这里用postman测试下进一步理解我们再通过一些问题来帮助你更深入理解ControllerAdvice。ControllerAdvice还可以怎么用除了通过ExceptionHandler注解用于全局异常的处理之外ControllerAdvice还有两个用法InitBinder注解用于请求中注册自定义参数的解析从而达到自定义请求参数格式的目的比如在ControllerAdvice注解的类中添加如下方法来统一处理日期格式的格式化InitBinder public void handleInitBinder(WebDataBinder dataBinder){dataBinder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat(yyyy-MM-dd), false)); }Controller中传入参数string类型自动转化为Date类型GetMapping(testDate) public Date processApi(Date date) {return date; }ModelAttribute注解用来预设全局参数比如最典型的使用Spring Security时将添加当前登录的用户信息UserDetails)作为参数。ModelAttribute(currentUser) public UserDetails modelAttribute() {return (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); }所有controller类中requestMapping方法都可以直接获取并使用currentUserPostMapping(saveSomething) public ResponseEntityString saveSomeObj(ModelAttribute(currentUser) UserDetails operator) {// 保存操作并设置当前操作人员的ID从UserDetails中获得return ResponseEntity.success(ok); }ControllerAdvice是如何起作用的原理DispatcherServlet中onRefresh方法是初始化ApplicationContext后的回调方法它会调用initStrategies方法主要更新一些servlet需要使用的对象包括国际化处理requestMapping视图解析等等。/*** This implementation calls {link #initStrategies}.*/ Override protected void onRefresh(ApplicationContext context) {initStrategies(context); }/*** Initialize the strategy objects that this servlet uses.* pMay be overridden in subclasses in order to initialize further strategy objects.*/ protected void initStrategies(ApplicationContext context) {initMultipartResolver(context); // 文件上传initLocaleResolver(context); // i18n国际化initThemeResolver(context); // 主题initHandlerMappings(context); // requestMappinginitHandlerAdapters(context); // adaptersinitHandlerExceptionResolvers(context); // 异常处理initRequestToViewNameTranslator(context);initViewResolvers(context);initFlashMapManager(context); }从上述代码看如果要提供ControllerAdvice提供的三种注解功能从设计和实现的角度肯定是实现的代码需要放在initStrategies方法中。ModelAttribute和InitBinder处理具体来看如果你是设计者很显然容易想到对于ModelAttribute提供的参数预置和InitBinder注解提供的预处理方法应该是放在一个方法中的因为它们都是在进入requestMapping方法前做的操作。如下方法是获取所有的HandlerAdapter无非就是从BeanFactory中获取private void initHandlerAdapters(ApplicationContext context) {this.handlerAdapters null;if (this.detectAllHandlerAdapters) {// Find all HandlerAdapters in the ApplicationContext, including ancestor contexts.MapString, HandlerAdapter matchingBeans BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerAdapter.class, true, false);if (!matchingBeans.isEmpty()) {this.handlerAdapters new ArrayList(matchingBeans.values());// We keep HandlerAdapters in sorted order.AnnotationAwareOrderComparator.sort(this.handlerAdapters);}}else {try {HandlerAdapter ha context.getBean(HANDLER_ADAPTER_BEAN_NAME, HandlerAdapter.class);this.handlerAdapters Collections.singletonList(ha);}catch (NoSuchBeanDefinitionException ex) {// Ignore, well add a default HandlerAdapter later.}}// Ensure we have at least some HandlerAdapters, by registering// default HandlerAdapters if no other adapters are found.if (this.handlerAdapters null) {this.handlerAdapters getDefaultStrategies(context, HandlerAdapter.class);if (logger.isTraceEnabled()) {logger.trace(No HandlerAdapters declared for servlet getServletName() : using default strategies from DispatcherServlet.properties);}} }我们要处理的是requestMapping的handlerResolver作为设计者就很容易出如下的结构在RequestMappingHandlerAdapter中的afterPropertiesSet去处理adviceOverride public void afterPropertiesSet() {// Do this first, it may add ResponseBody advice beansinitControllerAdviceCache();if (this.argumentResolvers null) {ListHandlerMethodArgumentResolver resolvers getDefaultArgumentResolvers();this.argumentResolvers new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);}if (this.initBinderArgumentResolvers null) {ListHandlerMethodArgumentResolver resolvers getDefaultInitBinderArgumentResolvers();this.initBinderArgumentResolvers new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);}if (this.returnValueHandlers null) {ListHandlerMethodReturnValueHandler handlers getDefaultReturnValueHandlers();this.returnValueHandlers new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers);} }private void initControllerAdviceCache() {if (getApplicationContext() null) {return;}ListControllerAdviceBean adviceBeans ControllerAdviceBean.findAnnotatedBeans(getApplicationContext());ListObject requestResponseBodyAdviceBeans new ArrayList();for (ControllerAdviceBean adviceBean : adviceBeans) {Class? beanType adviceBean.getBeanType();if (beanType null) {throw new IllegalStateException(Unresolvable type for ControllerAdviceBean: adviceBean);}// 缓存所有modelAttribute注解方法SetMethod attrMethods MethodIntrospector.selectMethods(beanType, MODEL_ATTRIBUTE_METHODS);if (!attrMethods.isEmpty()) {this.modelAttributeAdviceCache.put(adviceBean, attrMethods);}// 缓存所有initBinder注解方法SetMethod binderMethods MethodIntrospector.selectMethods(beanType, INIT_BINDER_METHODS);if (!binderMethods.isEmpty()) {this.initBinderAdviceCache.put(adviceBean, binderMethods);}if (RequestBodyAdvice.class.isAssignableFrom(beanType) || ResponseBodyAdvice.class.isAssignableFrom(beanType)) {requestResponseBodyAdviceBeans.add(adviceBean);}}if (!requestResponseBodyAdviceBeans.isEmpty()) {this.requestResponseBodyAdvice.addAll(0, requestResponseBodyAdviceBeans);} }ExceptionHandler处理ExceptionHandler显然是在上述initHandlerExceptionResolvers(context)方法中。同样的从BeanFactory中获取HandlerExceptionResolver/*** Initialize the HandlerExceptionResolver used by this class.* pIf no bean is defined with the given name in the BeanFactory for this namespace,* we default to no exception resolver.*/ private void initHandlerExceptionResolvers(ApplicationContext context) {this.handlerExceptionResolvers null;if (this.detectAllHandlerExceptionResolvers) {// Find all HandlerExceptionResolvers in the ApplicationContext, including ancestor contexts.MapString, HandlerExceptionResolver matchingBeans BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerExceptionResolver.class, true, false);if (!matchingBeans.isEmpty()) {this.handlerExceptionResolvers new ArrayList(matchingBeans.values());// We keep HandlerExceptionResolvers in sorted order.AnnotationAwareOrderComparator.sort(this.handlerExceptionResolvers);}}else {try {HandlerExceptionResolver her context.getBean(HANDLER_EXCEPTION_RESOLVER_BEAN_NAME, HandlerExceptionResolver.class);this.handlerExceptionResolvers Collections.singletonList(her);}catch (NoSuchBeanDefinitionException ex) {// Ignore, no HandlerExceptionResolver is fine too.}}// Ensure we have at least some HandlerExceptionResolvers, by registering// default HandlerExceptionResolvers if no other resolvers are found.if (this.handlerExceptionResolvers null) {this.handlerExceptionResolvers getDefaultStrategies(context, HandlerExceptionResolver.class);if (logger.isTraceEnabled()) {logger.trace(No HandlerExceptionResolvers declared in servlet getServletName() : using default strategies from DispatcherServlet.properties);}} }我们很容易找到ExceptionHandlerExceptionResolver同样的在afterPropertiesSet去处理adviceOverride public void afterPropertiesSet() {// Do this first, it may add ResponseBodyAdvice beansinitExceptionHandlerAdviceCache();if (this.argumentResolvers null) {ListHandlerMethodArgumentResolver resolvers getDefaultArgumentResolvers();this.argumentResolvers new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);}if (this.returnValueHandlers null) {ListHandlerMethodReturnValueHandler handlers getDefaultReturnValueHandlers();this.returnValueHandlers new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers);} }private void initExceptionHandlerAdviceCache() {if (getApplicationContext() null) {return;}ListControllerAdviceBean adviceBeans ControllerAdviceBean.findAnnotatedBeans(getApplicationContext());for (ControllerAdviceBean adviceBean : adviceBeans) {Class? beanType adviceBean.getBeanType();if (beanType null) {throw new IllegalStateException(Unresolvable type for ControllerAdviceBean: adviceBean);}ExceptionHandlerMethodResolver resolver new ExceptionHandlerMethodResolver(beanType);if (resolver.hasExceptionMappings()) {this.exceptionHandlerAdviceCache.put(adviceBean, resolver);}if (ResponseBodyAdvice.class.isAssignableFrom(beanType)) {this.responseBodyAdvice.add(adviceBean);}} }示例源码https://download.csdn.net/download/DeveloperFire/87554658推荐阅读Java面试系列-MySQLJAVA面试汇总精选系列
http://www.hkea.cn/news/14330817/

相关文章:

  • 大学选修课网站建设山西钢铁建设集团有限公司网站
  • godaddy域名买的网站热搜在哪里可以看
  • 做么网站有黄seo整体优化步骤怎么写
  • 网站集约化建设启示和建议免费网站管理系统
  • 网站建设全包公司推荐win7搭建wordpress
  • 重庆快速网站推广wordpress音乐主题pulse
  • 网销的网站建设与管理信用信息查询公示系统
  • 传统网站建设架构什么是百度快照
  • 怎样建设与维护自己的平台网站海南疾控发布问卷调查
  • 网站开发属于什么软件网站后台漏洞
  • 游戏交易网站开发公司建设网站需要什么条件
  • 服装设计以及网页设计素材廊坊seo技巧
  • 买书的网站排名体育评论做的好的网站
  • 南山-网站建设信科网络大数据平台建站
  • 网站建设 jsp php东莞网站建设58
  • 北京自助建站软件网站开发基本流程
  • 手机建站专家深圳app网站
  • 购物网站如何建设网站建设文化渠道
  • 快速开发企业网站一家公司可以做几个网站
  • 荣泰建设集团网站中小企业建站系统
  • 吉安网站公司网站推广策划思路是什么
  • 长垣有做网站设计的吗sem优化师是什么意思
  • 网站转换模块怎么做免费网页域名申请
  • 几何背景生成器网站阿里巴巴国际站怎么网站建设
  • 目前最好的网站建设企业网站开发维护运维
  • 厦门市建设工程在哪备案网站网站地图类型
  • 怎么为自己的厂做网站站长资源平台
  • 图书网站开发的实践意义深圳建设集团有限公司好吗
  • 大庆网站优化成都响应网站建设
  • 小说网站论文摘要网店图片怎么制作