問題描述
OpenFeign服務方回傳null物件,呼叫方得到的卻是一個具體物件,但是欄位為null
問題出現的環境背景及自己嘗試過哪些方法
在做注冊功能的時候通過Auth模塊傳遞引數username去user模塊查找,然后回傳user物件(無論是否為null),然后對user模塊回傳內容進行檢驗,根據是否為空進行后面的邏輯操作,但是當我user模塊回傳的user物件為null的時候auth模塊得到的user物件不為Null,但是他的欄位為null導致判空操作不命中.目前是通過獲取回傳的userId進行判空進行替代解決方案
相關代碼
AuthController
@PostMapping( "/regist/password" )
public String regist( @RequestBody @Valid UserRegistByPasswordReqVo userRegistByPasswordReqVo ,
BindingResult result ){
if( result.hasErrors() ) {
throw new BusinessException( "-1" , Objects.requireNonNull( result.getFieldError() ).getDefaultMessage() );
}
User user = userService.findUser( userRegistByPasswordReqVo.getUsername() );
//目前的替代方案
//if( user.getId() != null ) {
//throw new AuthException( //AuthErrorCode.ACCOUNT_EXIST_USERNAME );
}
// 通過判斷user是否為null的方案
Optional.ofNullable( user ).ifPresent( u -> {
if( u.getId() != null ) {throw new AuthException( AuthErrorCode.ACCOUNT_EXIST_USERNAME );}
} );
userService.addUser( userRegistByPasswordReqVo );
return "success";
}
Auth模塊的UserService
@FeignClient( "demos-user" )
public interface UserService{
@GetMapping( "/user/{username}" )
User findUser( @PathVariable String username );
@PostMapping("/user")
void addUser( UserRegistByPasswordReqVo userRegistByPasswordReqVo );
}
UserController
@PostMapping
@IgnoreResponseAdvice(errorDispose = false)
public User addUser( @RequestBody UserRegistByPasswordReqVo userRegistByPasswordReqVoVo ){
return userService.addUser( userRegistByPasswordReqVoVo );
// throw new UserException( UserErrorCode.TEST_ERROR );
}
@GetMapping( "/{username}" )
public User findUser( @PathVariable String username ){
try {
Thread.sleep( 2000L );
} catch( InterruptedException e ){
e.printStackTrace();
}
return userService.findByUsername( username );
}
你期待的結果是什么?實際看到的錯誤資訊又是什么?
期待的結果:
當userService.findUser()回傳Null的時候
Optional.ofNullable( user ).ifPresent( u -> {
if( u.getId() != null ) {throw new AuthException( AuthErrorCode.ACCOUNT_EXIST_USERNAME );}
} );不會拋出例外,user為null
實際看到的錯誤:

findUser查詢出的物件為null,

通過debug可以看到user為null,沒有地址值,而呼叫方的斷點卻顯示有地址值,欄位為null.

uj5u.com熱心網友回復:
Optional的作用就是物件為空,new 一個物件把uj5u.com熱心網友回復:
先確認 userService.findByUsername 是否回傳的是 null然后確認專案中有沒有 feign 攔截器做了什么處理
uj5u.com熱心網友回復:
截圖已經確定了是null了,然后代碼里feign沒有做攔截器配置uj5u.com熱心網友回復:
可以看看AuthController的代碼,但是在optional作用之前列印出來的物件就不是Null了啊?如果為空他就不會拋出例外了轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/235717.html
標籤:Web 開發
