Spring DataRepository可能返回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更具逻辑性。

10-06 01:37