将业务逻辑添加到 spring-data-rest 应用程序中

2022-09-02 01:55:49

我一直在尝试使用spring-data-rest(SDR),并且对构建rest api的速度印象深刻。我的应用程序基于以下存储库,它为我提供了GET /attachements和POST /attachements。

package com.deepskyblue.attachment.repository;

import java.util.List;

import org.springframework.data.repository.Repository;

import com.deepskyblue.attachment.domain.Attachment;

public interface AttachmentRepository extends Repository<Attachment, Long> {

    List<Attachment> findAll();

    Attachment save(Attachment attachment);
}

不过,我感到困惑的一件事是我如何添加自定义业务逻辑。如果我只想为我的数据提供一个 rest API,SDR 似乎很棒,但是传统的 Spring 应用程序通常有一个服务层,我可以在其中拥有业务逻辑。有没有办法将此业务逻辑与 SDR 一起添加?


答案 1

有很多可能性。

  1. 用于验证接收对象的验证程序(http://docs.spring.io/spring-data/rest/docs/current/reference/html/#validation)。

  2. 事件处理程序 http://docs.spring.io/spring-data/rest/docs/current/reference/html/#events),当验证正常时将调用。

  3. 自定义控制器 (http://docs.spring.io/spring-data/rest/docs/current/reference/html/#customizing-sdr.overriding-sdr-response-handlers)当您手动想要处理请求时。


答案 2

我最终创建了一个围绕存储库方法的自定义方面。像这样的东西(时髦):

@Aspect
@Component
@Slf4j
class AccountServiceAspect {

@Around("execution(* com.test.accounts.account.repository.AccountRepository.save*(..))")
    Object saveAccount(ProceedingJoinPoint jp) throws Throwable {
        log.info("in aspect!")
        Object[] args = jp.getArgs()

        if (args.length <= 0 || !(args[0] instanceof Account))
            return jp.proceed()

        Account account = args[0] as Account

        account.active = true
        jp.proceed(account)
    }
}

不理想,但您可以在保存之前修改模型,而无需从头开始编写spring数据休息控制器。


推荐