这是我的目标类:
@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 MyExtensionMapper
is:
@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中看到的那样)。