Spring Data
的Repository
可能返回null
,这对我来说是意外的,因此我使用了这样的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
样板的所有if (entity == null) throw new NullEntityException("null")
方法返回空值的最佳方法吗? 最佳答案
您的方法是正确的方法/方式。使用方面将异常包装到自定义异常中是正常做法。
同样,如果您具有自定义存储库实现,则可以覆盖方法findOne()
并从一个NullEntityException中抛出,或者可以将null包装到某些Optional或Null中,而不是使用异常对象,但是您需要调整客户端以处理此值。
请注意-NullEntityException("null")
-有点奇怪的名称和值,NotFoundException / ObjectNotFoundException(EntityNotFounException是java持久性的异常,最好不要创建具有相同名称的自定义异常)比NullEntityException更具逻辑性。