Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java mapStruct停止将数据映射到';s超级级';s场?_Java_Spring_Mapping_Mapstruct - Fatal编程技术网

Java mapStruct停止将数据映射到';s超级级';s场?

Java mapStruct停止将数据映射到';s超级级';s场?,java,spring,mapping,mapstruct,Java,Spring,Mapping,Mapstruct,我有一个DTOs类,它扩展了SpringHateOAS的ResourceSupport类。userminimadto是User实体的DTO 因此,为了生成映射器类,我使用 我正在使用ResourceSupport将hateoas链接添加到控制器的响应中 映射器接口 @Mapper public interface UserMinimalMapper { UserMinimalMapper INSTANCE = Mappers.getMapper(UserMinimalMapper.cl

我有一个DTOs类,它扩展了SpringHateOAS的
ResourceSupport
类。
userminimadto
User
实体的DTO

因此,为了生成映射器类,我使用

我正在使用
ResourceSupport
将hateoas链接添加到控制器的响应中

映射器接口

@Mapper
public interface UserMinimalMapper {

    UserMinimalMapper INSTANCE = Mappers.getMapper(UserMinimalMapper.class) ;

    UserMinimalDto entityToDto(User user);

    User dtoToEntity(UserMinimalDto userMinimalDto);
}
但是当我在项目上运行
mvncleanstall
时,我面临编译错误

无法将属性“org.springframework.hateoas.Link id”映射到 “java.lang.Integer id”。考虑声明/实现映射 方法:“java.lang.Integer映射(org.springframework.hateoas.Link 价值)“

这是因为
mapStruct
正在尝试映射
ResourceSupport
的字段。 如果:

  • 我将extends ResourceSupport从UserMinimalDto删除
  • 我删除dtoToEntity(userminimadto userminimadto);来自mapper 接口

  • 告诉
    mapStruct
    不映射超级类字段的配置是什么?

    这是因为模型类除了
    DTO
    之外还有其他一组字段,而且映射器会双向映射。但这很自然,dto没有id


    解决方法是从映射中排除这些字段,例如通过注释
    id
    和模型类中的其他字段,这些字段不在dto中:
    mapping(“this”)

    ,这是因为模型类具有除
    dto
    之外的其他字段集,而映射器是双向映射的。但这很自然,dto没有id


    解决方法是从映射中排除这些字段,例如通过注释
    id
    和模型类中的其他字段,这些字段不在dto中:
    mapping(“this”)
    ,以便在逐案基础上忽略字段,您可以使用
    映射#ignore

    在您的情况下,它将如下所示:

    @Mapper
    public interface UserMinimalMapper {
    
        UserMinimalMapper INSTANCE = Mappers.getMapper(UserMinimalMapper.class) ;
    
        UserMinimalDto entityToDto(User user);
    
        @Mapping(target = "id", ignore = true)
        @Mapping(target = "links", ignore = true)
        User dtoToEntity(UserMinimalDto userMinimalDto);
    }
    
    如果您的实体有一个公共接口/类,您可以使用
    @MapperConfig
    并定义这些排除项

    它可以看起来像:

    @MapperConfig(mappingInheritanceStrategy = MappingInheritanceStrategy.AUTO_INHERIT_FROM_CONFIG)
    public interface CommonMappingConfig {
    
        @Mapping(target = "id", ignore = true)
        @Mapping(target = "links", ignore = true)
        BaseEntity map(ResourceSupport resourceSupport);
    
    }
    
    @Mapper(config = CommonMappingConfig.class)
    public interface UserMinimalMapper {
    
        UserMinimalMapper INSTANCE = Mappers.getMapper(UserMinimalMapper.class) ;
    
        UserMinimalDto entityToDto(User user);
    
        User dtoToEntity(UserMinimalDto userMinimalDto);
    }
    

    要忽略基于具体情况的字段,可以使用
    映射#ignore

    在您的情况下,它将如下所示:

    @Mapper
    public interface UserMinimalMapper {
    
        UserMinimalMapper INSTANCE = Mappers.getMapper(UserMinimalMapper.class) ;
    
        UserMinimalDto entityToDto(User user);
    
        @Mapping(target = "id", ignore = true)
        @Mapping(target = "links", ignore = true)
        User dtoToEntity(UserMinimalDto userMinimalDto);
    }
    
    如果您的实体有一个公共接口/类,您可以使用
    @MapperConfig
    并定义这些排除项

    它可以看起来像:

    @MapperConfig(mappingInheritanceStrategy = MappingInheritanceStrategy.AUTO_INHERIT_FROM_CONFIG)
    public interface CommonMappingConfig {
    
        @Mapping(target = "id", ignore = true)
        @Mapping(target = "links", ignore = true)
        BaseEntity map(ResourceSupport resourceSupport);
    
    }
    
    @Mapper(config = CommonMappingConfig.class)
    public interface UserMinimalMapper {
    
        UserMinimalMapper INSTANCE = Mappers.getMapper(UserMinimalMapper.class) ;
    
        UserMinimalDto entityToDto(User user);
    
        User dtoToEntity(UserMinimalDto userMinimalDto);
    }
    

    它与模型类不完全相关,即这里的
    User
    。如果我将
    extensedresourcesupport
    userminimadto
    中删除,则映射器会完美地映射这两种方式。是
    ResourceSupport
    导致了这个问题。我有其他DTO和映射器,它们不需要
    ResourceSupport
    ,它们可以完美地映射字段。它与模型类(即
    User
    )没有完全的关系。如果我将
    extensedresourcesupport
    userminimadto
    中删除,则映射器会完美地映射这两种方式。是
    ResourceSupport
    导致了这个问题。我有其他DTO和映射器,它们不需要
    ResourceSupport
    ,它们可以完美地映射字段。这里的
    BaseEntity
    是什么?由我的所有实体类实现的接口/类?还是DTO类?它将是一个由所有实体类实现/扩展的接口/类。DTO类扩展
    ResourceSupport
    是否有方法继承多个
    config
    s?(因为这种方法是不可伸缩的)替代方法可以应用
    @AfterMapping
    ,但它使读取生成的映射器变得更加困难,因为我们需要来回跳转以查看映射。有一个功能要求,目前没有这种现成的东西,这里的
    BaseEntity
    是什么?由我的所有实体类实现的接口/类?还是DTO类?它将是一个由所有实体类实现/扩展的接口/类。DTO类扩展
    ResourceSupport
    是否有方法继承多个
    config
    s?(因为这种方法是不可伸缩的)替代方法可以应用
    @AfterMapping
    ,但它使读取生成的映射器变得更困难,因为我们需要来回跳转以查看映射。有一个功能要求,目前没有这种现成的东西