应为在代码中会存在这大量的判空, == 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);
    }
}

添加全局异常拦截之后的请求,自己自定义返回就可以了。

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐