Java mapStruct停止将数据映射到';s超级级';s场?
我有一个DTOs类,它扩展了SpringHateOAS的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
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
的字段。
如果:
告诉
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
,但它使读取生成的映射器变得更困难,因为我们需要来回跳转以查看映射。有一个功能要求,目前没有这种现成的东西