天天看點

MySQL - Spring Boot select and return null

問:MySQL查詢結果為空時會不會報錯?

@GetMapping("test")
public void test(String id) {
  User user = userService.getUserById(id);
  
  System.out.println("user: " + user);
}      

根據id查詢得到user,當user不存在時,列印結果如下:

user: null      

當user存在時,列印結果如下:

user: User(id=3, ..., createdDate=2021-04-21 00:00:17.0, updatedDate=2021-04-21 00:00:17.0, is_deleted=false)      

結論:MySQL查詢結果可以為空,并且不會報錯。

問:MySQL查詢結果為空,何時會報錯?

@GetMapping("test")
public void test(String id) {
    User user = userService.getUserById(id);
    
    System.out.println("user: " + user);

    System.out.println("id: " + user.getId());
}      

當user存在時,列印結果如下:

user: User(id=3, ..., createdDate=2021-04-21 00:00:17.0, updatedDate=2021-04-21 00:00:17.0, is_deleted=false)

id: 3      

根據id查詢得到user,當user不存在時,列印結果如下:

user: null      
MySQL - Spring Boot select and return null

使用Swagger測試時,直接報錯如上。

結論:空對象無法擷取屬性值!

問:MySQL查詢結果為空時,.java 抛出異常資訊,如何顯示?

@Override
public void validateUser(String id) {
  if (null == userMapper.getUserById(id)) {
    throw new GlobalException(MessageConstant.INVALID_USER);
  }
}      

.java直接抛出異常,這是内部抛出異常資訊,頁面顯示如下:

MySQL - Spring Boot select and return null

對于使用者而言,看不懂異常資訊,會直接認為是系統報錯!

問:發生異常時,封裝異常資訊實作方式一

*Controller.java

@GetMapping("test")
public GlobalException test() {
  return new GlobalException(MessageConstant.FAIL_FIND_USER);
}      

GlobalException.java

@Data
@NoArgsConstructor
public class GlobalException extends RuntimeException {
    private static final long serialVersionUID = 1L;

    private String msg;
    private int code = 500;

    public GlobalException(String msg) {
        super(msg);
        this.msg = msg;
    }
}      

發生異常時,抛出資訊如下:

{
  "cause": null,
  "stackTrace": [
    .... ,
    {
      "methodName": "run",
      "fileName": "Thread.java",
      "lineNumber": 748,
      "className": "java.lang.Thread",
      "nativeMethod": false
    }
  ],
  "msg": "Fail to find user",
  "code": 500,
  "localizedMessage": "Fail to find user",
  "message": "Fail to find user",
  "suppressed": []
}      

異常資訊内容過多,大概有250行左右。

問:發生異常時,封裝異常資訊實作方式二

  • ResponseResult.java
@Data
public class ResponseResult<T> {
    private final Integer code;
    private final String message;
    private final T data;

    ...

    public static <T> ResponseResult<T> success(T data) {
        return new ResponseResult<>(ResultStatusType.SUCCESS, data);
    }

    public static <T> ResponseResult<T> failure(ResultStatusType resultStatusType, String message, T data) {
        return new ResponseResult<>(resultStatusType, message, data);
    }
}      
  • ResultStatusType.java
@Getter
public enum ResultStatusType {
    SUCCESS(0, "OK"),
    BAD_REQUEST(HttpStatus.BAD_REQUEST.value(), "Bad Request"),
    INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Internal Server Error"),
    ;

    private final Integer code;
    private final String message;

    ResultStatusType(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}      
  • UserController.java
@GetMapping("test")
public ResponseEntity<ResponseResult<String>> test(String id) {
  User user = userService.getUserById(id);

  if (user != null) {
    return new ResponseEntity<>(ResponseResult.success(MessageConstant.SUCCESS), HttpStatus.OK);
  } else {
    return new ResponseEntity<>(ResponseResult.failure(ResultStatusType.INTERNAL_SERVER_ERROR, MessageConstant.FAIL_FIND_USER, null), HttpStatus.BAD_REQUEST);
  }
}      

對象為空時,傳回結果如下:

MySQL - Spring Boot select and return null