gpt4 book ai didi

java - 当接收实体的更新时,如何访问不应该理解传入 DTO 的类中的先前值?

转载 作者:行者123 更新时间:2023-12-02 11:15:19 25 4
gpt4 key购买 nike

如果某个实体的更新以 DTO 的形式发送到我的后端,并且我有一个类需要访问该实体的先前值和新值,那么设置此值的好方法是什么起来?

当前的代码看起来有点像这样:

//temporarily store old values
SomeReferencedEntity previousReferencedEntity = existingObject.getSomeReferencedEntity();
boolean previouslyEnabled = existingObject.isEnabled();
int previousNumber = existingObject.getNumber();

//update entity with new values
existingObject.setSomeReferencedEntity(newSomeReferencedEntity); //from dto conversion
existingObject.setEnabled(dto.isEnabled());
existingObject.setNumber(dto.getNumber());

//call other class with new and old values
someExternalSystemAdministrator.update(previousReferencedEntity, previouslyEnabled, previousNumber, existingObject);

但这似乎不是一个很好的方法。那么我的选择是什么?

  • 我考虑过从 DTO 实例化实体,这样我就可以将 2 个完整实体(包括对我必须实例化的其他一些实体的引用)传递给我的 externalSystemAdministrator 类,因此我们只能逐个比较。然而,这感觉像是滥用我永远不会真正坚持新的实体类值(value)观。
  • 我考虑过将新的 DTO 传递给externalSystemAdministrator 类,但有很多步骤在可以理解新值之前需要采取类(class)。让这样的类看到任何 DTO 的感觉也不好。
  • 我还可以为 externalSystemAdministrator 类创建一些简单的值类来处理并传递该类的 2 个实例,而不是将其传递给我的域实体。这是我现在最喜欢的选项,但这确实意味着我需要能够稍后根据外部系统的响应为我的实际实体设置一些值。

有更聪明的方法来设置它吗?最好以通用/标准/可接受的方式。

最佳答案

创建一个事件来通知更改。例如,您将拥有由 DTO 的旧版本和新版本表示的事件类:

public class ObjectChangedEvent {
private MyDto oldValue;
private MyDto newValue;
...
}

然后您上面发布的代码将在更新实体后发布事件:

applicationEventPublisher.publishEvent(objectChangedEvent);

最后,需要知道两个版本的组件将收到更改通知:

public class MyComponent implements ApplicationListener<ObjectChangedEvent> {

@Override
public void onApplicationEvent(ObjectChangedEvent event) {
//your logic goes here
}

}

You can find more details here

默认情况下Spring进行同步调用,但我强烈建议您更改为异步调用。在这种特定情况下,它似乎没有太大变化,但需要花费大量时间执行的同步请求可能会使您的应用程序停止响应新请求。

关于java - 当接收实体的更新时,如何访问不应该理解传入 DTO 的类中的先前值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50323412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com