@NotBlank @NotNull 全局捕获异常返回自定义封装
应为在代码中会存在这大量的判空, == null , isEmpty,isNull 等等。会导致代码很不美观而且不便管理,所以使用到了javax.validation的@NotBlank(String类型判空),@NotNull等方式去在Dto层进行判断。DTO举例:import io.swagger.annotations.ApiModel;import io.swagger.annotatio
·
应为在代码中会存在这大量的判空, == null , isEmpty,isNull 等等。会导致代码很不美观而且不便管理,所以使用到了javax.validation的@NotBlank(String类型判空),@NotNull等方式去在Dto层进行判断。
DTO举例:
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel("登录接收参数")
@Accessors(chain = true)
public class UserLoginDto {
@ApiModelProperty(value="账号",required = true)
@NotBlank(message = "账号不可为空")
private String userName;
@ApiModelProperty(value="密码",required = true)
@NotBlank(message = "密码不可为空")
private String password;
}
应为系统中返回的统一JSON格式为:
{
"code":"500",
"data":"",
"msg":"xxx错误"
}
登录接口为:
@ApiOperation(value = "用户登录")
@PostMapping(value = "/login")
@Log(value = "登录", type = "1")
public Result<SysUserEntity> list(@Valid @RequestBody UserLoginDto user) {
Subject subject = SecurityUtils.getSubject();
try {
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(user.getUserName(), user.getPassword());
subject.login(usernamePasswordToken);
} catch (UnknownAccountException e) {
return Result.error("账号不存在");
} catch (LockedAccountException lock) {
return Result.error("用户被锁定");
} catch (IncorrectCredentialsException exception) {
return Result.error("密码错误");
}
SysUserEntity userEntity = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
if (Objects.isNull(userEntity.getRoleId())) return Result.error("账号未绑定角色");
userEntity.setResourceTree(roleResourceService.getRoleResource(userEntity.getRoleId()));
return Result.success(userEntity, "登录成功");
}
模拟未捕捉全局异常出现拦截的情况
这个是默认的返回值
但是这么返回肯定不是前端所需要的,总不能一层一层去拿出来吧。
所以需要对整体的做一个拦截异常捕捉。
解决办法:添加配置文件做全局异常捕捉,里面的Result为自己写的返回封装。
import com.crm.logistics_crm.bean.Result;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.stream.Collectors;
@ControllerAdvice
public class WebExceptionHandler {
//处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常
@ExceptionHandler(BindException.class)
@ResponseBody
public Result BindExceptionHandler(BindException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return Result.error(message);
}
//处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public Result ConstraintViolationExceptionHandler(ConstraintViolationException e) {
String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
return Result.error(message);
}
//处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常。
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Result MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return Result.error(message);
}
}
添加全局异常拦截之后的请求,自己自定义返回就可以了。
更多推荐
已为社区贡献1条内容
所有评论(0)