springBoot @Valid 參數校驗

項目中的接口一般都是需要進行參數校驗的,這裏簡單記錄一下springboot項目中使用 @Validated和@Valid註解實現接口入參的校驗;

第一步:創建用於接收參數的實體類

package com.zhh.eDemo.business.model;

import java.io.Serializable;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

/**
 * 用於接收請求參數
 */
public class User implements Serializable{
	private static final long serialVersionUID = 1L;
	
	@NotBlank(message="id不能爲空")
	private String id;
	
	@NotBlank(message="用戶名不能爲空")
	@Size(min=1,max=10,message="用戶名應爲1至10個字符")
	private String name;
	
	@Pattern(regexp="^1([3-9])\\d{9}$",message="手機號格式不正確")
	private String phoneNumber;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhoneNumber() {
		return phoneNumber;
	}
	public void setPhoneNumber(String phoneNumber) {
		this.phoneNumber = phoneNumber;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", phoneNumber="
				+ phoneNumber + "]";
	}
}

第二步:創建controller類

package com.zhh.eDemo.business.controller;

import javax.validation.Valid;

import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.zhh.eDemo.business.model.User;
import com.zhh.eDemo.common.ResultBean;

@Validated // 開啓參數驗證
@RestController
public class BizController {

	
	@RequestMapping("/editUser")
	public ResultBean test(@Valid @RequestBody User user, BindingResult b) {
		System.out.println("入參:"+user.toString());
		return ResultBean.success(user);
	}
	
	/**
	 * 請求調用
	 */
	public static void main(String[] args) {
		User user = new User();
		user.setId("10089");
		user.setName("");
		user.setPhoneNumber("18810039");

		RestTemplate rTemplate = new RestTemplate();
		ResponseEntity<String> rEntity = rTemplate.postForEntity("http://127.0.0.1:8086/eDemo/editUser", user, String.class);
		System.out.println("\n請求參數:" + user.toString());
		System.out.println("\n請求響應:\n" + rEntity.getBody());
	}
}

第三步:創建全局返回對象

package com.zhh.eDemo.common;

import java.io.Serializable;

/**
 * 公共返回實體
 */
public class ResultBean implements Serializable{
	
	private static final long serialVersionUID = -1239208490844340719L;
	
	/** 響應代碼 */
	private String code;
	/** 響應描述 */
	private String message;
	/** 響應數據 */
	private Object data;
	
	public ResultBean(){}
	
	public ResultBean(String code,String message,Object data){
		this.code = code;
		this.message = message;
		this.data = data;
	}
	
	public ResultBean(Object data){
		this.code = "1";
		this.message = "成功";
		this.data = data;
	}
	
	/**
	 * 獲取操作成功的對象
	 */
	public static ResultBean success(Object data){
		return new ResultBean(data);
	}
	
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}

}

第三步,創建全局異常處理類

package com.zhh.eDemo.exception;

import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolationException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

import com.zhh.eDemo.common.ResultBean;

/**
 * 全局異常處理
 * @author zhh
 */
@ControllerAdvice
public class ExceptionAdvice extends ResponseEntityExceptionHandler{

	private static final Logger log = LoggerFactory.getLogger(ExceptionAdvice.class);
	
	/**
	 * 異常捕獲
	 */
	@ResponseBody
	@ExceptionHandler(Exception.class)
	public ResultBean handleControllerException(HttpServletRequest request,Throwable e) {
		// 參數校驗異常
		if (e instanceof ConstraintViolationException) {
			String message = e.getMessage();
			log.error("ConstraintViolationException:",message);
			return new ResultBean(this.getStatus(request),message,null);
		}
		// 系統異常
		log.error("Exception:",e);
		return new ResultBean(this.getStatus(request),e.getMessage(),null);
	}
	
	/**
	 * 獲取響應狀態信息
	 */
	private String getStatus(HttpServletRequest request) {
		String code = (String)request.getAttribute("javax.servlet.error.status_code");
		if (StringUtils.isEmpty(code)) {
			return String.valueOf(HttpStatus.INTERNAL_SERVER_ERROR.value());
		}
		return code;
	}
}

執行結果:

注意點:

controller類上面需要添加註解:@Validated

接口方法的參數前面添加註解:@Valid

接口方法的參數需要添加:BindingResult

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章