@RestControllerAdvice原创
直接上代码,后面再说怎么用
1、这个是一个Form,用来接收参数的,一个简单的NotEmpty注解校验,merchantName这个参数是必传的;
package com.cloudwalk.shark.dto.validate;

import org.hibernate.validator.constraints.NotEmpty;

public class AdvertQueryForm {
@NotEmpty
private String merchantName; private String merchantCode; private String clientCode; private String id; public String getMerchantName() {
return merchantName;
} public void setMerchantName(String merchantName) {
this.merchantName = merchantName;
} public String getMerchantCode() {
return merchantCode;
} public void setMerchantCode(String merchantCode) {
this.merchantCode = merchantCode;
} public String getClientCode() {
return clientCode;
} public void setClientCode(String clientCode) {
this.clientCode = clientCode;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
}
}

2、Controller中直接通过RequestBody取到参数,下面是重点@Validated

这个注解可以直接用来校验传递的参数;

package com.cloudwalk.shark.controller;

import com.cloudwalk.shark.common.utils.ResponseData;
import com.cloudwalk.shark.dto.validate.AdvertQueryForm;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
@RequestMapping(value = "/validate", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
public class SharkValidationController { @PostMapping("/bean")
@ResponseBody
public ResponseData checkBeanIsValid(@Validated @RequestBody AdvertQueryForm advertQueryForm){
return new ResponseData(true,"2","3",advertQueryForm);
}
}

直接友好的捕获了你的参数校验异常,统一的去实现了参数异常的捕获!

重点!produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}这个参数如果不设定,默认返回的就会是XML;

package com.cloudwalk.shark.config.controllerException;

import com.cloudwalk.shark.common.em.GlobalCodeEnum;
import com.cloudwalk.shark.common.utils.ResponseData;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Set; @RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public ResponseData handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) {
StringBuilder errorInfo = new StringBuilder();
BindingResult bindingResult = exception.getBindingResult();
for(int i = 0; i < bindingResult.getFieldErrors().size(); i++){
if(i > 0){
errorInfo.append(",");
}
FieldError fieldError = bindingResult.getFieldErrors().get(i);
errorInfo.append(fieldError.getField()).append(" :").append(fieldError.getDefaultMessage());
} //返回BaseResponse
ResponseData response = new ResponseData();
response.setMessage(errorInfo.toString());
response.setCode(GlobalCodeEnum.FAIL.getErrorCode());
return response;
} @ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ResponseData<String> handleConstraintViolationException(ConstraintViolationException exception) {
StringBuilder errorInfo = new StringBuilder();
String errorMessage ; Set<ConstraintViolation<?>> violations = exception.getConstraintViolations();
for (ConstraintViolation<?> item : violations) {
errorInfo.append(item.getMessage()).append(",");
}
errorMessage = errorInfo.toString().substring(0, errorInfo.toString().length()-1); ResponseData<String> response = new ResponseData<String>();
response.setMessage(errorMessage);
response.setCode(GlobalCodeEnum.FAIL.getErrorCode());
return response;
} @ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseData<String> handleDefaultException(Exception exception) { ResponseData<String> response = new ResponseData<>();
response.setMessage("其他错误");
response.setCode(GlobalCodeEnum.FAIL.getErrorCode());
return response;
}
}

Validation(3)--全局参数异常校验捕获及返回XML解决的更多相关文章

  1. Spring 捕捉校验参数异常并统一处理

    使用 @Validated ,@Valid ,@NotBlank 之类的,请自行百度,本文着重与捕捉校验失败信息并封装返回出去 参考: https://mp.weixin.qq.com/s/EaZxY ...

  2. SpringBoot 全局异常拦截捕获处理

    一.全局异常处理 //Result定义全局数据返回对象 package com.xiaobing.demo001.domain; public class Result { private Integ ...

  3. (转)springboot全局处理异常(@ControllerAdvice + @ExceptionHandler)

    1.@ControllerAdvice 1.场景一 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0, "data": ...

  4. Spring @ControllerAdvice @ExceptionHandler 全局处理异常

    对于与数据库相关的 Spring MVC 项目,我们通常会把 事务 配置在 Service层,当数据库操作失败时让 Service 层抛出运行时异常,Spring 事物管理器就会进行回滚. 如此一来, ...

  5. 十四、springboot全局处理异常(@ControllerAdvice + @ExceptionHandler)

    1.@ControllerAdvice 1.场景一 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0, "data": ...

  6. spring mvc 全局处理异常

    spring框架支持很多种全局处理异常的方式 一.Spring MVC处理异常有4种方式: (1)使用Spring-MVC提供的SimpleMappingExceptionResolver: (2)实 ...

  7. springmvc 全局的异常拦截处理 @ControllerAdvice注解 @ExceptionHandler

    第一步: Dispatcher前端控制器的源码中 默认的 private boolean throwExceptionIfNoHandlerFound = false;说明如果没有找到匹配的执行器,不 ...

  8. springboot之全局处理异常封装

    springboot之全局处理异常封装 简介 在项目中经常出现系统异常的情况,比如NullPointerException等等.如果默认未处理的情况下,springboot会响应默认的错误提示,这样对 ...

  9. WebApi安全性 参数签名校验(结合Axios使用)

    接口参数签名校验,是WebApi接口服务最重要的安全防护手段之一. 结合项目中实际使用情况,介绍下前后端参数签名校验实现方案. 签名校验规则 http请求,有两种传参形式: 1.通过url传参,最常见 ...

随机推荐

  1. Android笔记之强大的buildConfigField

    在进行项目开发或维护时,经常会遇到调试和发布所用到的参数值不一致的情况 例如,服务器会分测试和正式,为了能方便地更改(自动更换)服务器地址,buildConfigField就派上用场了 以前都是手动更 ...

  2. 面试算法爱好者书籍/OJ推荐

    面试算法爱好者书籍/OJ推荐 这个书单也基本适用于准备面试. 一.教科书 基本上一般的算法课本介绍的范围都不会超出算法导论和算法引论的范围.读完这两本书,其它的算法课本大致翻翻也就知道是什么货色了. ...

  3. The PageFactory

    The PageFactory 原文地址:https://github.com/SeleniumHQ/selenium/wiki/PageFactory In order to support the ...

  4. uni-app 创建的第一个应用

    本人微信公众号:前端修炼之路,欢迎关注 背景介绍 经过上一篇文章uni-app官方教程学习手记的学习之后,我就着手做这个项目了. 目前已经初步搭出了整体的框架,秉着取之于社会,回馈于社会的原则,我将这 ...

  5. git使用笔记(四)错误报告 Git push rejected error: fatal: refusing to merge unrelated histories

    Reason: The reason is because I created repo in Github with initiated README.md file, and I tried to ...

  6. ansible 文件模块,很实用

    摘自: http://blog.csdn.net/kellyseeme/article/details/50545521

  7. html5--3.22 综合实例03

    html5--3.22 综合实例03 学习要点 通过一个综合实例来回顾学过的内容 这一章的内容比较多,不必强求一下子全记住,多做一些练习,用得多了自然就可以记住了 可以自己找一些实例练练手,比如各网站 ...

  8. python3 安装 opencv3 (win10,64bit)

    python3只能安装opencv3  (python2安装opencv应该比python3安装的要简单,可参阅网上其他教程)   步骤参考http://stackoverflow.com/quest ...

  9. [LeetCode] Longest Valid Parentheses -- 挂动态规划羊头卖stack的狗肉

    (Version 1.3) 这题在LeetCode上的标签比较有欺骗性,虽然标签写着有DP,但是实际上根本不需要使用动态规划,相反的,使用动态规划反而会在LeetCode OJ上面超时.这题正确的做法 ...

  10. windows下的套接字IO模型

    一般情况下,IO操作的行为受两种因素的影响: IO操作对象的类型(阻塞还是非阻塞) 获取IO操作结果的方式(同步还是异步). 同步就是指操作的发起和操作结果的获取由调用者完成. 异步指操作发起由调用方 ...