Mapstruct:映射器被忽略



这是我的目标类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Extension {
private String url;

}

源类是(来自第三方库):

public class Extension extends BaseExtension implements IBaseExtension<Extension, Type>, IBaseHasExtensions {
protected UriType url;

public boolean hasUrl() { 
return this.url != null && !this.url.isEmpty();
}
public Extension setUrlElement(UriType value) { 
this.url = value;
return this;
}
public String getUrl() { 
return this.url == null ? null : this.url.getValue();
}
public Extension setUrl(String value) { 
if (this.url == null)
this.url = new UriType();
this.url.setValue(value);
return this;
}
}

如您所见,我需要将UriType字段映射到String字段。

我创建了这个映射器:

@Mapper
public abstract class UriTypeMapper {
public String fhirToMpi(UriType uriType) {
return uriType.getValue();
}
}

And MyExtensionMapperis:

@Mapper(uses={UriTypeMapper.class})
public interface ExtensionMapper {
Extension fhirtoMpi(org.hl7.fhir.r4.model.Extension extension);
}

但是,实现不使用UriTypeMapper:

package cat.gencat.catsalut.hes.mpi.mapper;
import cat.gencat.catsalut.hes.mpi.model.Extension;
import javax.annotation.processing.Generated;
@Generated(
value = "org.mapstruct.ap.MappingProcessor"
)
public class ExtensionMapperImpl implements ExtensionMapper {
@Override
public Extension fhirToMpi(org.hl7.fhir.r4.model.Extension fhirType) {
if ( fhirType == null ) {
return null;
}
Extension extension = new Extension();
if ( fhirType.hasUrl() ) {
extension.setUrl( fhirType.getUrl() );
}
return extension;
}
}
如你所见,它使用了:
extension.setUrl( fhirType.getUrl() );

代替UriTypeMapper

编辑:目标urtype类文档在这里。

编辑:我已经启用了额外的日志:

[INFO]  MapStruct: processing: cat.gencat.catsalut.hes.mpi.mapper.ExtensionMapper.
[INFO] - MapStruct: creating bean mapping method implementation for cat.gencat.catsalut.hes.mpi.model.Extension fhirToMpi(org.hl7.fhir.r4.model.Extension fhirType).
[INFO] -- MapStruct: mapping property: fhirType.getUrl() to: setUrl(java.lang.String).
[INFO] -- MapStruct: selecting property mapping: fhirType.getUrl().

正如你所看到的,它是从org.hl7.fhir.r4.model.Extension中选择setUrl(String)方法,而不是我所描述的UriTypeMapper

任何想法?

由于来自Extension的第三方实现返回String on, getUrl ',并且您也映射到String,因此Mapstruct不需要调用您的自定义方法并且隐式映射生效(正如您在ExtensionMapperImpl中看到的那样)。

相关内容

  • 没有找到相关文章