2017-07-17 27 views
1

Spring DataRepository可以返回null這是意想不到的我,所以我用這樣的AOP:這是一個好的做法是使用AOP避免庫空返回

@Around("execution(* com.example.demo.repository.*.findOne(..))") 
public Object aroundRepository(ProceedingJoinPoint pjp) throws Throwable { 
    Object[] args = pjp.getArgs(); 
    Object ret = pjp.proceed(args); 
    if (ret == null) throw new NullEntityException("null"); 
    return ret; 
} 

其中NullEntityException是一個自定義異常將在這裏處理:

@ControllerAdvice 
public class CustomControllerAdvice { 

    @ExceptionHandler({NullEntityException.class}) 
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 
    @ResponseBody 
    ErrorMessage handleCustomException(Exception e) { 
     return new ErrorMessage(e.getMessage()); 
    } 
} 

我的項目中的控制器都是@RestController。那麼,是否在我的DAO層中防止所有findOne方法返回null,並且沒有if (entity == null) throw new NullEntityException("null")樣板文件?

回答

0

您的方法是正確的方法。使用aspect來將異常包裝到自定義異常中是正常的做法。

此外,如果你有自定義存儲庫的實現,你可以重寫方法findOne()並從一個NullEntityException拋出,或者你可以將null包裝成一些可選或空值,而不是使用異常對象,但你需要調整客戶端來處理這個值。

Just remark - NullEntityException("null") - 有點奇怪的名字和值,NotFoundException/ObjectNotFoundException(EntityNotFounException是java持久性的異常,最好不要創建具有相同名稱的自定義異常)比NullEntityException更符合邏輯。

+0

感謝您的回答和命名建議! – zl2003cn

0

從技術上講,它工作正常。但是,您可能會丟失有用的商業信息,因此一般處理這些nulls

null從存儲庫返回通常意味着「該項目未找到」。 不是內部錯誤,只是他們要求的東西不存在。 我想爲那些返回404響應。

有時候可能意味着「出錯了 - 我沒有想到在這裏會出現空白」。 我想爲那些返回一個500。

知道什麼null意味着在您的應用程序的具體業務知識。因此,根據您的系統,您的存儲庫可能無法應用此類通用解決方案。

但是,如果你確定null總是意味着有什麼可怕的錯誤,並且你總是想扔500回來,那麼你得到的是好的。

相關問題