使用Spring Data获取单个NonNull值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Spring Data获取单个NonNull值相关的知识,希望对你有一定的参考价值。
我想在我的Repository中有一个返回单个值的方法。像这样:
TrainingMode findByTrainingNameAndNameEng( String trainingName, String nameEng );
http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/ Spring Data Docs描述了在这种情况下,如果没有找到实体,该方法可以返回null。我想抛出像No TrainingMode found by %trainingName% and %nameEng%
或smth这样的通用消息的异常。
我可以使用Optional<TrainingMode>
作为返回值,然后使用orElseThrow
Optional<TrainingMode> findByTrainingNameAndNameEng( String trainingName, String nameEng );
repository.findByTrainingNameAndNameEng(name, nameEng).orElseThrow(() -> new RuntimeException(...));
但是每次调用此方法时我都应该调用此方法。目前尚不清楚 - DRY原则是否被打破。
如何使用Spring Data获取orElseThrow的非空单值?
如果在整个调用它的应用程序逻辑中复制空值处理,则会违反DRY原则。如果DRY原则是您最担心的事情,那么我可以想到:
- 您可以创建一个“服务”类,该类将调用委托给注释的存储库并处理它的空响应逻辑,并使用该服务类而不是直接调用存储库。缺点是会为您的应用程序引入另一个层(这会将存储库与您的应用程序逻辑分离)。
- 可以向数据存储库添加自定义行为,这在文档的“3.6.1. Adding custom behavior to single repositories”部分中有所描述。很抱歉没有发布代码段。
我个人使用第二种方法的问题是它污染应用程序的界面,强制你遵循某些命名模式(从不喜欢'Impl'后缀),并可能使迁移代码更耗时(当应用程序变大时,它变为更难以跟踪哪个界面负责哪个自定义行为,然后人们只是简单地开始创建他们自己的行为,结果证明是另一个的重复)。
我找到了解决方案。
首先,Spring Data处理getByName和findByName。我们可以使用它:在我的情况下,find *可以返回null(或返回not null可选,如你所愿)和get *应该只返回值:如果返回null则抛出异常。
我决定在这种情况下使用AOP。这是方面:
@Aspect
@Component
public class GetFromRepositoryAspect {
@Around("execution(public !void org.springframework.data.repository.Repository+.get*(..))")
public Object aroundDaoMethod( ProceedingJoinPoint joinpoint ) throws Throwable {
Object result = joinpoint.proceed();
if (null == result) {
throw new FormattedException( "No entity found with arhs %s",
Arrays.toString( joinpoint.getArgs() ) );
}
return result;
}
}
就这样。
以上是关于使用Spring Data获取单个NonNull值的主要内容,如果未能解决你的问题,请参考以下文章
Spring 5 core 中的 @NonNull 是个什么鬼?!
如何在本机查询中使用 NVL 或 COALESCE 获取 Spring Data JPA 中的值列表