简介:在一个springboot项目中针对于异常我们可以通过局部捕捉或者抛出,但针对于未做任何处理的异常,我们可以通过在项目中配置一个全局的异常处理或者特定的异常处理返回给前端页面,告诉页面具体的报错信息。比如:异常是由于参数不对或者没有造成的异常,通过处理来告诉前端相关报错信息,以此来提高开发效率。
1.首先我们添加lombok优雅代码相关依赖,使用其中的一些注解来确定相关的实体类中的属性性质。
<!--spring boot Lombok优雅代码util-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
2.实体相关属性,是否是必传非必传,属性添加到响应的分组里。
import com.ylkz.annotation.paramsValid.PhoneValid;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class AgentVo {
//这里我们进行相关分组,比如select报错分组,insert报错分组。。。
public interface Bind{}
public interface Unbind{}
public interface Search{}
public interface Check{}
@NotNull(message = "经纪人id不能为空",groups = Unbind.class)
private Integer agentId;
@NotNull(message = "商户id不能为空",groups = {Bind.class,Check.class})
private Integer enterpriseId;
@NotBlank(message = "商户名称不能为空",groups = Bind.class)
private String enterpriseName;
@NotBlank(message = "手机号不能为空",groups = {Bind.class,Check.class})
@PhoneValid(message = "请输入正确的手机号",groups = Bind.class)
private String mobile;
@NotBlank(message = "经纪人昵称不能为空",groups = Bind.class)
private String nickName;
private String agentIdCardNum;
}
3.具体的全局异常处理类及特殊的异常处理代码
import com.ylkz.entity.vo.ResultMessage;
import com.ylkz.enums.ResponseCode;
import com.ylkz.util.ExcpUtil;
import lombok.extern.java.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Log
@RestControllerAdvice//该注解的使用支持切面类的使用
public class GlobalExceptionHandler {
protected Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(Exception.class)//该注解的使用可以捕捉到响应的异常信息,比如此处的使用可以获取到最大的exception,未进行异常处理,可以通过全局的异常处理告诉前端,代码报错信息。
ResultMessage handleException(Exception e) {
logger.error(ExcpUtil.getStackTraceString(e));
return new ResultMessage(true,10001,"后端异常!",null);
}
@ExceptionHandler(value = MethodArgumentNotValidException.class)//此处的使用是为了针对于参数异常的异常处理,如果有相应的参数异常信息会进行处理。
public Object MethodArgumentNotValidHandler(MethodArgumentNotValidException exception){
//按需重新封装需要返回的错误信息
StringBuilder errorMessage = new StringBuilder(exception.getBindingResult().getFieldErrors().size() * 16);
//解析原错误信息,封装后返回,此处返回非法的字段名称,错误信息
for (FieldError error : exception.getBindingResult().getFieldErrors()) {
if(errorMessage != null && errorMessage.length() > 0)
errorMessage.append(",");
errorMessage.append(error.getField());
errorMessage.append(":");
errorMessage.append(error.getDefaultMessage());
}
return new ResultMessage(ResponseCode.PARAMS_IS_INVALID.getCode(), errorMessage.toString());
}
}
4.具体的Controller里通过添加@Validated(AgentVo.Check.class)注解校验的相应参数。
@ResponseBody
@RequestMapping(value = "checkMobileIsBindOther", method = RequestMethod.POST)
public ResultMessage checkMobileIsBindOther(@Validated(AgentVo.Check.class) @RequestBody AgentVo agentVo) {
ResultMessage resultMessage = channelCorpFeign.checkMobileIsBindOther(agentVo);
return resultMessage;
}