【问题标题】:How to do a calculation on an entity in a GET/find on Spring Data Rest?如何在 Spring Data Rest 上的 GET/find 中对实体进行计算?
【发布时间】:2019-07-16 17:48:46
【问题描述】:

我正在使用@RepositoryRestResource 设施,但我想在每次用户执行读取操作 GET、查找等时对瞬态字段进行计算(取决于外部服务)。

如果列表中只有 AfterGet/AfterFind 事件,我可以通过扩展 AbstractRepositoryEventListener 来处理修改

有什么干净的建议吗?

【问题讨论】:

  • 使用AOP怎么样?
  • @PostLoad 实体监听器将是一个可能的解决方案。传统上,使实体侦听器受弹簧管理涉及一些黑客行为,但是这里有一个答案表明这在 Spring/Hibernate 的最新版本中现在很简单。如果不是,则存在其他解决方案。 stackoverflow.com/a/55452014/1356423
  • 谢谢!但是我需要调用一个外部服务,我不确定在无状态实体监听器中为@PostLoad 注入一个依赖项是否有意义
  • 我不确定在无状态实体监听器中为@PostLoad 注入一个依赖项是否有意义。对不起,但这意味着什么?逻辑将由实体外部的实体侦听器处理,而不是通过其中定义的回调方法,例如thejavageek.com/2014/05/24/jpa-entitylisteners
  • 我的计算依赖于外部调用,如果实体和实体监听器是无状态的,我应该把它放在哪里?

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


【解决方案1】:

我通过@Alan Hay 的建议找到了方法。

@Entity
@EntityListeners(TransientFieldResolver.class)
public class Entity {

    private Long id;
    private String transientField;
}

@Component
public static class TransientFieldResolver {

    private static ExternalService externalService;

    @Autowired
    public void setExternalService(ExternalService externalService) {
        TransientFieldResolver.externalService = externalService;
    }

    @PostLoad
    public void onPostLoad(final Entity entity) {
        if (Objects.isNull(entity.getTransientField())) {
            TransientFieldResolver.externalService.fillTransientField(entity);
        }
    }
}

【讨论】:

  • 具有讽刺意味的是,我有一个项目接受没有无参数构造函数的注入实体,但它在所有项目中都不一致......或者最近允许的功能
猜你喜欢
  • 2018-03-02
  • 2016-01-08
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2014-11-12
  • 2020-04-22
  • 1970-01-01
  • 2016-11-15
相关资源
最近更新 更多