gpt4 book ai didi

java - 在 Spring 数据注释中混合

转载 作者:行者123 更新时间:2023-12-05 06:10:41 25 4
gpt4 key购买 nike

当我逐渐尝试在我的库的域部分中删除对 Spring 的依赖时,我现在转向 Spring Data 和 Repositories

最初我们将域实体注释为如下所示:

@Document
public void MyEntity {
@Id
@Getter private final EntityIdentifier identifier;

@PersistenceConstructor
public MyEntity( ... ) {}
...
}

等等。其中 @Document , @PersistenceConstructor@Id源自Spring Project,部分针对特定数据库后端(MongoDB)。

我想减少这种依赖并使用我自己的注释,这在我的域中很有意义 - @Document绝对是我的领域专家在出现在例如 clas Chair 上时不会理解的东西或 Desk .

为了使用 Jackson 进行反序列化/序列化,我可以创建mixins 来向类添加特定注释,而无需修改它们的来源。
也许有一种类似的 Spring 技术或其他一些方法可以实现这一点,它比创建包装类更优雅?


显然我需要一些说明:

假设我们尝试编写一个干净的架构应用程序,它由以下模块组成:domain , adapters , application .在domain模块,我有我的域逻辑和域实体以及域中的所有内容。我没有任何弹性 - 完全不依赖于 spring,甚至没有以某种方式依赖于 spring 的依赖性。
adaptersapplication模块,我确实依赖于 spring。我可能会使用 spring-data 来实现 Repository-Adapters。我将使用 Spring 配置应用程序并将其粘合在一起。

现在,在我的域模块中,我有以下类:

@AllArgsConstructor
@HashAndEquals(of="identifier")
@DomainEntity // <-- This is an Annotation that has no dependency on Spring!
public class DomainEntity {
@DomainId // <-- This is an Annotation that has no dependency on Spring!
@Getter private final DomainEntityIdentifier identifier;

@Getter @Setter private String someValue;
...
}

@HashAndEquals
@AllArgsConstructor
public class DomainEntityIdentifiers {
@Getter private final String name;
}

public void interface DomainEntityRepository {
DomainEntity findById(DomainEntityIdentifier identifier);
void save(DomainEntity domainEntity)
void deleteById(DomainEntityIdentifier identifier);
}

现在的任务是,在 adapters 中提供该接口(interface)的实现。模块,使用 Spring Data - 例如spring-data-mongo并将此适配器注入(inject) application 中的域模块。

现在,我可以创建一个类,比方说 DomainEntityMongo这与 DomainEntity 基本相同仅使用 spring-data-mongo-annotations,然后是 public interface MyEntityRepository extends CrudRepository<EntityIdentifier, MyEntityMongo>并实现接口(interface) DomainRepository通过使用 MyEntityRepository并在 DomainEntityMongo <=> DomainEntity 之间来回转换.

我正在寻找的是一个更神奇/通用的解决方案。例如

  • 拥有 jackson 风格的混合类,为 Spring 提供必要的/缺失的元数据来完成工作
  • 将 Spring 配置为使用非 spring-annotations 来完成工作(就像 ComponentScan 用于非组件继承 Annotations 一样)
  • 或者 - 如果数据专家设计了另一个创新解决方案 - 这个创新解决方案。

最佳答案

你可以使用@JsonDeserialize(使用 = yourCustomizedDeserializer.class)看看这里 https://www.baeldung.com/jackson-deserialization

您可以使用@Persister 自定义您的持久性策略。例如,您可以指定您自己的 org.hibernate.persister.EntityPersister 子类,或者您甚至可以提供接口(interface) org.hibernate.persister.ClassPersister 的全新实现,它通过存储过程调用、序列化等方式实现持久性平面文件或 LDAP。

这就是你要找的吗?

关于java - 在 Spring 数据注释中混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64334936/

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