使用AOP避免从存储库返回null是一个好习惯

时间:2017-07-17 12:02:06

标签: java spring

Spring Data的{​​{1}}可能会返回Repository这对我来说意外,所以我使用这样的AOP:

null

其中@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()); } } 。那么在我的DAO层中没有@RestController样板的所有findOne方法阻止空返回的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

您的方法是正确的方法/方式。使用aspect将异常包装到自定义异常中是正常的做法。

此外,如果您有自定义存储库实现,您可以覆盖方法findOne()并从一个NullEntityException抛出,或者您可以将null包装到一些Optional或Null中,而不是使用异常对象,但您需要调整客户端处理这个值。

Just remark - NullEntityException("null") - 一个奇怪的名称和值,NotFoundException / ObjectNotFoundException(EntityNotFounException是java persistance的异常,最好不要创建具有相同名称的自定义异常)比NullEntityException更逻辑。

答案 1 :(得分:0)

从技术上讲,它运作正常。但是,通过如此一般地处理这些nulls,您可能会丢失有用的商业信息。

从存储库返回的

null通常意味着"该项目未找到"。 不是内部错误,只是他们要求的东西不存在。 我想为那些返回404响应。

有时它可能意味着出现了问题 - 我并没有在这里期望空白"。 我想为那些返回500.

了解null意味着什么是您的应用程序中的特定业务知识。因此,根据您的系统,您的存储库可能无法应用这样的通用解决方案。

但是,如果你确定null总是意味着出现了可怕的错误,并且你总是希望为此投入500,那么你得到的就是好的。