我有一个实体类,如:
class SomeEntity {
int id;
string name;
date created;
}
我有一个dto课程,就像:
class SomeDto {
class SomeDtoAttributes {
string name;
date created;
}
string id;
SomeDtoAttributes attributes;
}
基本上,除了id之外,实体上的所有属性都会放在dto上的attributes属性中。
我希望这个映射器能够被其他实体/dtos重用,这些实体/dtos遵循相同的模式,但具有不同的属性。
我已经阅读了文档,但我不清楚如何实现这一点。目前,我有这样的情况:
abstract class EntityMapper<DTO, DTOA E> {
abstract E toEntity(DTO dto, DTOA attributes);
abstract DTO toDto(E entity);
abstract DTOA toDtoAttributes(E entity);
abstract List<E> toEntityList(List<DTO> dtos);
abstract List<DTO> toDtoList(List<E> entities);
@AfterMapping
protected void afterMapping(@MappingTarget DTO dto, E entity) {
DTOA dtoAttributes = this.toDtoAttributes(entity);
dto.setAttributes(dtoAttributes);
}
}
但是,我不喜欢在dto
方法中传递dtoAttributes
和dtoAttributes
,而toEntityList
方法没有填充返回实体的属性属性。
发布于 2018-04-20 11:38:19
如果你的实体和dtos都是这样的话。在一些接口和泛型的帮助下,您可以实现这样的目标。
class SomeDto implements Dto<SomeDtoAttribute> {
class SomeDtoAttributes implements DtoAttributes {
String name;
date created;
}
String id;
SomeDtoAttributes attributes;
}
然后在你的地图里你可以做到
abstract class EntityMapper<DTO extends Dto<DTOA>, DTOA, E> {
E toEntity(DTO dto) {
E entity = toEntity(dto.getAttributes());
if (entity != null) {
entity.setId(dto.getId());
}
return entity;
}
@Mapping(target = "id", ignore = true)
abstract E toEntity(DTOA dtoAttributes);
abstract DTO toDto(E entity);
abstract DTOA toDtoAttributes(E entity);
abstract List<E> toEntityList(List<DTO> dtos);
abstract List<DTO> toDtoList(List<E> entities);
@AfterMapping
protected void afterMapping(@MappingTarget DTO dto, E entity) {
DTOA dtoAttributes = this.toDtoAttributes(entity);
dto.setAttributes(dtoAttributes);
}
}
https://stackoverflow.com/questions/49929486
复制