@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; } }
