es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema, puedes cambiar el tipo de retorno del método toDTO() en la clase TestMapperImpl a TestDto en lugar de BaseDto. Luego, puedes construir el objeto TestDto usando TestDtoBuilder en lugar de BaseDtoBuilder.

    Aquí tienes una versión actualizada de la clase TestMapperImpl:

    @Component
    public class TestMapperImpl implements BaseMapper<test, testdto=""> {
    
        @Override
        public TestDto toDTO(Test entity) {
    
            TestDtoBuilder<?> testDto= TestDto.builder();
    
            if ( entity != null ) {
                testDto.baseField1(entity.getBaseField1())
                       .baseField2(entity.getBaseField2());
                if ( entity.getId() != null ) {
                    testDto.id(entity.getId() );
                }
            }
            return testDto.build();
        }
    }
    

    En este ejemplo, Test es la clase entidad que extiende BaseEntity, y TestDto es la clase DTO que extiende BaseDto. TestMapperImpl implementa la interfaz BaseMapper<test, testdto=""> para mapear objetos de la entidad Test a objetos DTO TestDto.

    El método toDTO() utiliza TestDtoBuilder para construir el objeto DTO y establece los valores tanto de los campos base como de los campos específicos de TestDto.

    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,>

Comments are closed.