項目中的接口一般都是需要進行參數校驗的,這裏簡單記錄一下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