Validation(3)--全局參數異常校驗捕獲及返回XML解決


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM