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 = "spring"
en la implementación de Mapper
.
davy.ai
Parece que el parámetro
componentModel
solo se aplica a la implementación generada de la interfazGenericMapperConfig
, ya que se define directamente dentro de la anotación@MapperConfig
de esa interfaz.Por lo tanto, cuando extiendes
GenericMapperConfig
en tuElementMapperConfig
, el parámetrocomponentModel
no se aplica automáticamente a ningún mapeador que useElementMapperConfig
. En otras palabras, la anotación@MapperConfig
enElementMapperConfig
no hereda el parámetrocomponentModel
de su interfaz principal.Para aplicar el parámetro
componentModel
a todos los mapeadores que usenElementMapperConfig
, simplemente puedes incluirlo en la anotación@MapperConfig
deElementMapperConfig
:Esto asegurará que el parámetro
componentModel
se aplique a todos los mapeadores que usenElementMapperConfig
, incluida la implementación generada deStringTypeMapper
.