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: MapperConfig ignorado

Tengo dos MapperConfig:

@MapperConfig(
    uses = {
        StringTypeMapper.class,
        ExtensionMapper.class
    }
)
public interface ElementMapperConfig extends GenericMapperConfig {

<pre><code>@Mapping(target = "id", source = "idElement")
@Mapping(target = "extension", source = "extension")
Element mapElement(org.hl7.fhir.r4.model.Element fhir);
</code></pre>

<p>}

Y GenericMapperConfig:

@MapperConfig(
    componentModel = "spring",
    injectionStrategy = InjectionStrategy.CONSTRUCTOR,
    nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
    nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL
)
public interface GenericMapperConfig {</p>

<p>}

Como puedes ver, estoy utilizando el modelo de componente spring.

Sin embargo, la implementación de Mapper está obteniendo el Mapper requerido utilizando Mappers.getMapper(...)

Como puedes ver, ElementMapperConfig extiende de GenericMapperConfig, pero parece que la configuración de GenericMapperConfig se ignora.

Ejemplo de Mapper generado:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor"
)
public class StringTypeMapperImpl implements StringTypeMapper {</p>

<pre><code>private final ExtensionMapper extensionMapper = Mappers.getMapper( ExtensionMapper.class );
</code></pre>

<p>}

StringTypeMapper es:

@Mapper(
    config = ElementMapperConfig.class
)
public interface StringTypeMapper {</p>

<pre><code>@InheritConfiguration(name = "mapElement")
StringType fhirToMpi(org.hl7.fhir.r4.model.StringType stringType);
</code></pre>

<p>}

No logro entender por qué la configuración de GenericMapperConfig no se está aplicando, es decir, no entiendo por qué se ignora componentModel = &quot;spring&quot; en la implementación de Mapper.

Tags:  

Answer

  1. Avatar for davy.ai

    Parece que el parámetro componentModel solo se aplica a la implementación generada de la interfaz GenericMapperConfig, ya que se define directamente dentro de la anotación @MapperConfig de esa interfaz.

    Por lo tanto, cuando extiendes GenericMapperConfig en tu ElementMapperConfig, el parámetro componentModel no se aplica automáticamente a ningún mapeador que use ElementMapperConfig. En otras palabras, la anotación @MapperConfig en ElementMapperConfig no hereda el parámetro componentModel de su interfaz principal.

    Para aplicar el parámetro componentModel a todos los mapeadores que usen ElementMapperConfig, simplemente puedes incluirlo en la anotación @MapperConfig de ElementMapperConfig:

    @MapperConfig(
        componentModel = "spring",
        uses = {
            StringTypeMapper.class,
            ExtensionMapper.class
        }
    )
    public interface ElementMapperConfig extends GenericMapperConfig {
    
        @Mapping(target = "id", source = "idElement")
        @Mapping(target = "extension", source = "extension")
        Element mapElement(org.hl7.fhir.r4.model.Element fhir);
    
    }
    

    Esto asegurará que el parámetro componentModel se aplique a todos los mapeadores que usen ElementMapperConfig, incluida la implementación generada de StringTypeMapper.

Comments are closed.