【问题标题】:Spring Data Rest handling AfterLinkSaveEventSpring Data Rest 处理 AfterLinkSaveEvent
【发布时间】:2021-09-06 22:06:12
【问题描述】:

假设有两个简单的实体:

@Entity
public class Author {
    private String name;
    @ManyToMany
    private List<Book> books;

@Entity
public class Book {
    private String title;
    @ManyToMany
    private List<Author> authors;

接下来我发送PATCH 请求更新作者:

http://localhost:8080/authors/1
body:
{
    "books": [
        "http://localhost:8080/books/2",
        "http://localhost:8080/books/3"
    ]
}

有一个处理程序:

@RepositoryEventHandler
public class AuthorEventHandler {
    @HandleBeforeSave
    public void handleBeforeAuthorSave(Author author) {
        System.out.println("handleBeforeSave Author: " + author);
    }

    @HandleAfterSave
    public void handleAfterAuthorSave(Author author) {
        System.out.println("HandleAfterSave Author: " + author);
    }

    @HandleBeforeLinkSave
    public void handleBeforeLinks(Author author, List<Book> books) {
        System.out.println("handleBeforeLinks Author: " + author);
    }

    @HandleAfterLinkSave
    public void handleAfterLinks(Author author, List<Book> books) {
        System.out.println("handleAfterLinks Author: " + author);
    }
}

处理程序仅捕获AfterSaveEventBeforeSaveEvent。 Spring 不会产生 Before-AfterLinkSave 事件。

编辑
我注意到了这个方法:

@RequestMapping(value = BASE_MAPPING, method = { PATCH, PUT, POST }
createPropertyReference()

BASE_MAPPING = "/{repository}/{id}/{property}"; 所以http://localhost:8080/authors/1/books 上的 PATCH 请求会触发它。这不是我从一开始就想到的方式。

【问题讨论】:

    标签: java spring-boot spring-data-jpa spring-data-rest


    【解决方案1】:

    确实 Spring Data Rest 不会产生 Before-AfterLinkSave 事件;只有BeforeAfter

    当然,在不知道您要解决什么特定问题的情况下很难说,但是如果您需要处理 Before-After = Aroud 执行,那么您可能需要查看 Spring AOP,使用它您可以创建一个 Pointcut 到存储库保存方法并设置一个 Advice(基本上是拦截器)围绕该方法执行。

    通知是方面在特定连接点处采取的行动。 不同类型的建议包括“周围”、“之前”和“之后” 建议。

    【讨论】:

    • 我试图解决两个问题:首先我希望在/{repository}/{id} 上触发LinkEvents 而不是/{repository}/{id}/{property}(但这是不可能的)。第二个 - 添加对事件的事务支持。这个stackoverflow.com/a/53236152/4207793 帮助我做到了。
    • 太棒了!所以AOP是最终要走的路。很高兴你解决了你的问题。好的一点是事务支持,事件真的不支持与方法执行的连接。
    • 是的。然后只有一个区别,我只包含webmvc.RepositoryEntityControllerwebmvc.RepositoryPropertyReferenceController 这两个类,而不是整个data.rest.webmvc 包。 (这两种情况都适用)
    猜你喜欢
    • 1970-01-01
    • 2018-08-22
    • 2016-08-20
    • 2016-03-12
    • 2016-10-26
    • 2017-11-28
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多