メインコンテンツまでスキップ
Version: v2.1.0

コンバータクラス


コンバータクラスは、DBエンティティの各フィールドの値を、対応するFHIRリソースのプロパティの値に変換するためのメソッド群を持ったクラスです。
汎用的な変換メソッドが実装されているCommonConverterクラスを継承して、さらに必要な変換メソッドを追加した独自のコンバータクラスを作成します。

public class PatientPropertyConverter extends CommonConverter {

コンバータクラスは通常内部状態を持たないため、getInstance()メソッドを定義して、シングルトンなインスタンスを返すようにします。

private static PatientPropertyConverter instance = new PatientPropertyConverter();

public static PatientPropertyConverter getInstance() {
return instance;
}

内部状態を持たせたい場合は、変換先のFHIRリソースと変換元のResourceResourceを引数とする、publicなコンストラクタを作成してください。
コード生成ツール(MapperGenerator)は、そのようなコンストラクタを検知すると、マッピング時に毎回コンバータクラスのインスタンスをnewします。

public PatientPropertyConverter(Patient dst, PatientResourceResource src) {

変換先のプロパティがListの場合は、変換メソッドの戻り値をvoidにすることで、第一引数に該当プロパティのListが渡されます。
第一引数で渡されたListに対して変換結果をaddしていくことで、それまでのListの内容を保持したまま変換結果の追加が可能です。

public void humanNameList(List<HumanName> dst, String family, String given) {
dst.add(humanName(family, given));
}
public HumanName humanName(String family, String given) {
HumanName humanName = new HumanName();
humanName.setFamily(family);
StringType stringType = new StringType();
stringType.setValue(given);
humanName.getGiven().add(stringType);
return humanName;
}

変換メソッドの引数に、複数のDBエンティティクラスのフィールド値を渡したい場合は、ResourceResourceの実装クラスでpreProcessメソッドをoverrideします。

「方法1 - preProcess内で変換メソッドを呼び出す」

@Override
public void preProcess(SomeResource dst, PropertyConverter conv){
SomePropertyConverter converter = (SomePropertyConverter) conv;
SomeClass value = converter.someConversion(someEntity1.getXxx(), someEntity2.getYyy());
dst.setSomeProperty(value);
}

「方法2 - preProcess内でDBエンティティに値をコピーする」

@Override
public void preProcess(SomeResource dst, PropertyConverter conv){
// 値を集約するEntity(ここでは仮にIntegratedEntity)に値をコピーします
integratedEntity.setXxx(someEntity1.getXxx());
integratedEntity.setYyy(someEntity2.getYyy());
}

// 値を集約するEntityにもアノテーションを付与しておきます
@FhirComposition
@Getter
@Setter
private IntegratedEntity integratedEntity;

@FhirComposition
@Getter
@Setter
private SomeEntity1 someEntity1;

@FhirComposition
@Getter
@Setter
private SomeEntity2 someEntity2;
@Override
public void preProcess(SomeResource dst, PropertyConverter conv){
// 「方法2の別パターン」
// アノテーション対象となるDBエンティティにフィールドを追加して値をコピーします
someEntity1.setYyy(someEntity2.getYyy());
}