1、统一处理参数校验
对于请求参数校验,我们可以使用spring的validation包,依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.4.1</version>
</dependency>
引入jar包之后便可以在请求参数那里使用@Valid进行校验,校验的规则就在参数bean的属性上加对应的校验规则注解即可。
@PostMapping("/reg")
public ResultWrapper register(@RequestBody @Valid UserMemberDTO userMemberDTO) {
String result = umsMemberService.register(userMemberDTO);
return ResultWrapper.getSuccessBuilder().data(result).build();
}
import lombok.Data;
import lombok.ToString;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
@Data
@ToString
public class UserMemberDTO implements Serializable {
@Size(max = 8, min = 2, message = "名称长度必须在2~8个字符")
private String username;
@NotNull
private String password;
private String icon;
@Email
private String email;
private String nickName;
}
校验规则使用的是javax.validation.constraints包下面的注解。
对于获取校验之后,如何将校验结果返回给前端,需要使用统一的校验结果处理类ResponseEntityExceptionHandler
import com.msb.dongbao.common.base.result.ResultWrapper;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@ControllerAdvice
public class ValidateHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
StringBuilder sb = new StringBuilder();
for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
sb.append(" "+fieldError.getDefaultMessage());
break;
}
return new ResponseEntity<>(ResultWrapper.builder().code(102).msg(sb.toString()).build(),
HttpStatus.OK);
}
}
在这里使用@RestControllerAdvice和使用@ControllerAdvice 效果是一样的。因为返回值是ResponseEntity。
2、统一异常返回处理
import com.msb.dongbao.common.base.result.ResultWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 统一处理全局异常
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
public ResultWrapper globalException(Exception e) {
log.error("globalException",e);
return ResultWrapper.getFailBuilder().data(e.getMessage()).build();
}
}
使用@ExceptionHandler注解进行拦截所有Exception,当然可以自定义Exception进行拦截,只需要将Exception.class替换为自定义类.class。
使用@RestControllerAdvice来实现请求的返回,可以使用自定义的返回对象。 如果使用@ControllerAdvice 就不能使用自定义的返回对象,会报404错误。如果要使用@ControllerAdvice, 返回对象必须是ResponseEntity,前端才不会404。