当前位置: 首页 > 知识库问答 >
问题:

模型映射器DTO到实体

段干博明
2023-03-14

我正在为我们班做一个项目。需要将DTO映射到实体,反之亦然。我的DTO没有Id字段,转换正在控制器层进行。另外两个类正在扩展我的实体,因此@Superbuilder。

我的转换实体-

但是DTO-

如果你们谁能帮我找到解决办法,我将不胜感激。提前感谢您的时间和回复。

=======我的DTO=====

@Value
@Jacksonized
@Builder
@AllArgsConstructor
public class UserMetaData {

    @NotNull @NotBlank @NotEmpty(message = "First name cannot be empty!")
    @JsonProperty("firstName")
    String firstName;
    @NotNull @NotBlank @NotEmpty(message = "Last name cannot be empty!")
    @JsonProperty("lastName")
    String lastName;
    @Max(value = 110, message = "Invalid age!") @Min(value = 16, message = "Must be older than 16!")
    @JsonProperty("age")
    int age;
    @NotNull
    @JsonProperty("privilege")
    Privilege privilege;
    //@NotNull
    @JsonProperty("alias")
    String alias;
    //@Singular
    @JsonProperty("groups")
    Set<Group> groups;


}

=====我的实体=====

@Document(collection = "Users")
@SuperBuilder
@Data
@RequiredArgsConstructor(onConstructor = @__(@PersistenceConstructor))
public class Member implements User {

@Id
protected final UUID id;
protected final String firstName;
protected final String lastName;
protected final int age;
@Builder.Default
protected final Privilege privilege = NONE;
protected String alias;
protected Set<Group> groups;

protected Set<Group> addGroup(Group group) {
    this.groups.add(group);
    return this.groups;
}

}

====ModelMapper的Bean=====

 @Bean
public ModelMapper modelMapper() {
    ModelMapper modelMapper = new ModelMapper();
    modelMapper.getConfiguration()
            .setFieldMatchingEnabled(true)
            .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE);
    return modelMapper;
}

======转换器=====

 private UserMetaData convertToDTO(Member member) {
    return modelMapper.map(member, UserMetaData.UserMetaDataBuilder.class)
            .build();
}

private Member convertToEntity(UserMetaData dto) {
//        return modelMapper.map(dto, Member.MemberBuilder.class).id(UUID.randomUUID()).build();
    return Member.builder()
            .id(UUID.randomUUID())
            .firstName(dto.getFirstName())
            .lastName(dto.getLastName())
            .age(dto.getAge())
            .build();
}

共有1个答案

龙德润
2023-03-14

您的DTO类使用的是@Builder,而实体类使用的是@SuperBuilder。编译项目后查看目标文件:

  • @Builder将创建一个名为DTOBuilder的静态类,它有一个公共构造函数
public class DTO {
    //...
    public static class DTOBuilder {
         public DTOBuilder() {
         }
    }
}
  • @SuperBuilder将创建一个公共抽象类EntityBuilder和一个带有私有构造函数的私有实现类EntityBuilderImpl
public class Entity {
     //...
     public abstract static class EntityBuilder<...> {
     }
     //...
     private static final class EntityBuilderImpl extends EntityBuilder {
            private EntityBuilderImpl() {
            }
     }
}

因此,ModelMapper要求目标类应该是公共类公共构造函数。这就是为什么您不能映射到EntityBuilder,但可以使用DTOBuilder


解决方案是,您应该直接映射到实体,而不是映射到EntityBuilder。请注意,您的实体必须具有参数构造函数


@noargsconstuctor添加到实体中,并将DTO转换为实体类,而不是EntityBuilder

//...
@NoArgsConstructor
public class Member implements User {
//...
}

private Member convertToEntity(UserMetaData dto) {
    return modelMapper.map(dto, Member.class);
}

 类似资料:
  • 我正在尝试使用AutoMapper在LLBLGen实体和DTO之间创建映射。 我的DTO如下所示: ParentEntity包含一个与DTO列表同名的ChildCollection和一个Id(需要忽略其他LLBL字段)。因此,当ParentEntity映射到父d to时,它也应该将ChildCollection映射到一个子列表。 这就是我到目前为止得到的: 这会导致Id被映射,但List的计数为0

  • 当我尝试通过枚举将源中的字符串映射到目标中的整数时。ModelMapper失败。 来源 目的地 字符串和整数之间的映射在枚举中定义

  • 使用Spring MVC,我们通常会看到控制器、服务和存储库层。仓库层使用实体模型,实体模型与数据库是一对一的映射。我想过跟着- 服务层应该使用相同的实体模型吗? 服务层应该使用单独的域模型吗?如果是,那么到/到来回映射应该在服务层完成? 控制器层我们应该使用相同的域模型吗? 控制器层应该使用单独的DTO模型吗?如果是,那么到/来回映射应该在控制器层完成? 我们有什么简单的方法可以在不写太多冗长代

  • 问题内容: 我是Go语言的新手,具有C#背景并且对如何构造Go应用程序感到困惑。 假设我正在构建一个REST API,它将位于数据库之上。还要说,即使完成后,鉴于业务的变迁等,此应用程序可能仍需要频繁更改。 在带有诸如Entity Framework和DTO之类的工具的C#中,我通过从控制器给出的结果中抽象出数据库来缓解此问题。如果更改数据库中一堆字段的名称,则可能必须更改数据库访问逻辑,但是希望

  • 我目前正在应用程序中手动将DTO映射到BO(反之亦然)。然而,这种方法既尴尬又笨拙。 这两种表示之间有没有好的映射器? 我的要求如下: 应该支持将JPA代理转换为标识符(DTO不应该直接链接到其他DTO)。或者这个功能应该很容易实现 应该基于注释,保证优于配置 软标准:应该允许将多个DTO映射到一个实体(反之亦然) 谢谢你的建议。

  • 我有一种情况,在一个DTO中有另一个DTO,我必须映射到它对应的实体。 我正在使用mapstruct,我已经有antherEntityMapper已经存在。 如何更改EntityMapper接口,以便我可以将一个另一个EntityDTO映射到另一个Entity? 谢谢