コンバータクラス
コンバータクラスは、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());
}