MapStruct @SuperBuilder Error de tipo de retorno no convertido.
BaseDto:
@Data
@NoArgsConstructor
@SuperBuilder
public class BaseDto{
// Algunos campos
}
TestDto:
@Data
@NoArgsConstructor
@SuperBuilder
public class TestDto extends BaseDto {
// Algunos campos
}
Base Mapper:
@MapperConfig(
componentModel = "spring"
)
public interface BaseMapper<E extends BaseEntity, DTO extends BaseDto> {
DTO toDto(E entity);
....
}
Implementación de Mapper Generado:
@Component
public class TestMapperImpl implements BaseMapper {
@Override
public TestDto toDTO(Test entity) {
BaseDtoBuilder<?, ?> testDto= BaseDto.builder();
if ( entity != null ) {
if ( entity.getId() != null ) {
testDto.id(entity.getId() );
}
}
return testDto.build();
}
}
El Mapper crea automáticamente la clase de implementación. El problema es el tipo de retorno.
BaseDtoBuilder<?, ?> testDto= BaseDto.builder();
return testDto.build();
Intelij muestra un error en el tipo de retorno, debería ser convertido a TestDto. Debido a que el mapper devuelve un BaseDto. ¿Cómo puedo resolver este problema?
Nota: si se utiliza @Builder, no hay error, funciona correctamente, pero en este caso no se puede acceder a las propiedades del padre.
davy.ai
Para resolver el problema, puedes cambiar el tipo de retorno del método
toDTO()
en la claseTestMapperImpl
aTestDto
en lugar deBaseDto
. Luego, puedes construir el objetoTestDto
usandoTestDtoBuilder
en lugar deBaseDtoBuilder
.Aquí tienes una versión actualizada de la clase
TestMapperImpl
:En este ejemplo,
Test
es la clase entidad que extiendeBaseEntity
, yTestDto
es la clase DTO que extiendeBaseDto
.TestMapperImpl
implementa la interfazBaseMapper<test, testdto="">
para mapear objetos de la entidadTest
a objetos DTOTestDto
.El método
toDTO()
utilizaTestDtoBuilder
para construir el objeto DTO y establece los valores tanto de los campos base como de los campos específicos deTestDto
.Al especificar explícitamente el tipo de retorno como
TestDto
, IntelliJ ya no mostrará un error y podrás acceder tanto a las propiedades del padre como del hijo del DTO.</test,></test,>