使用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原则是您最担心的事情,那么我可以想到:

  1. 您可以创建一个“服务”类,该类将调用委托给注释的存储库并处理它的空响应逻辑,并使用该服务类而不是直接调用存储库。缺点是会为您的应用程序引入另一个层(这会将存储库与您的应用程序逻辑分离)。
  2. 可以向数据存储库添加自定义行为,这在文档的“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 中的值列表

获取单个值而不是数组?

使用 spring data jpa 更新单个字段

无法使用 double 类型的左值初始化“id _NonNull”类型的参数

GraphQL 错误:变量 'id' 已强制 NonNull 类型 'ID!' 的 Null 值