Spring Boot @RepositoryEventHandler未被调用

Ben*_*nny 7 spring spring-data spring-data-jpa spring-data-rest spring-boot

我有一个@RepositoryEventHandler设置,并没有因为一些未知的原因被调用.

@Component
@RepositoryEventHandler(User.class)
public class UserEventHandler {

    @Autowired
    private PasswordCrypto passwordCrypto;

    @HandleBeforeSave
    public void handleUserSave(User user) {
        if (user.getPassword() != null && !"".equals(user.getPassword())) {
            user.setPassword(passwordCrypto.encrypt(user.getPassword()));
        }
    }

    @HandleBeforeCreate
    public void handleUserCreate(User user) {
        user.setPassword(passwordCrypto.encrypt(user.getPassword()));
    }
}
Run Code Online (Sandbox Code Playgroud)

存储库:

public interface UserRepository extends CrudRepository<User, Long> {
    Optional<User> findOneByUsername(String username);
}
Run Code Online (Sandbox Code Playgroud)

而我的主要课程:

@SpringBootApplication
@EntityScan("de.ihrig.feuerwehr.hydranet.model")
@EnableJpaRepositories
@ComponentScan({
    "somepath",
    "somepath including the UserEventHandler"
})
public class ServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢您提前的帮助,我只是找不到错误.

Sne*_*kse 2

可能有几件事正在发生。

您的存储库没有注释 w/ @RestResource,但我猜这只是一个疏忽。

我猜这些注释是正确的,并且您正在通过单元测试来测试它,其入口点不通过 REST API。唯一handlers捕获通过该向量传入的 Repo 事件。

如果您想捕获任何存储库事件,无论入口点如何,那么您需要使用AbstractRepositoryEventListener

Spring Data Rest Events 文档对此进行了介绍。另请参阅在 spring boot 中侦听存储库事件

  • _“如果您想捕获任何存储库事件,无论入口点如何,那么您想使用 AbstractRepositoryEventListener”_ &lt;-- 我不太确定。我刚刚测试了这个并制作了一个 AbstractRepositoryEventListener。它确实触发了我的 REST 调用,但不在我的 CommandLineRunner 类中触发,在该类中我最初使用存储库将一些数据插入到数据库中。该类位于 org.springframework.data.rest.core.event 包中的事实也使其值得怀疑。 (3认同)