HAPI FHIR Instance Validator --- HAPI FHIR中,用來做FHIR Validation的工具為Instance Validator。最基本的Instance Vlidator如下: ``` FhirContext ctx = FhirContext.forR4(); // Ask the context for a validator FhirValidator validator = ctx.newValidator(); // Create a validation module and register it IValidatorModule module = new FhirInstanceValidator(ctx); validator.registerValidatorModule(module); ... ValidationResult result = validator.validateWithResult(resource); ``` 和其他的功能類似,FhirContext為基礎,第一步為產生一validtor,然後生成一validation module並註冊於剛建立的validator。這樣就建立了一個可以實現基本的FHIR Validation。使用方法為呼叫validator.validateWithResult() 由於相關資源都來自基本的FhirContext,可以預期這樣的validator可以做的驗證工作就受限於FHIR標準。 除了使用標準的FhirContext外,也可以使用validation support chain,舉例如下: ``` FhirContext ctx = FhirContext.forR4(); // Create a validation support chain ValidationSupportChain validationSupportChain = new ValidationSupportChain( new DefaultProfileValidationSupport(ctx), new InMemoryTerminologyServerValidationSupport(ctx), new CommonCodeSystemsTerminologyService(ctx)); // Create a FhirInstanceValidator and register it to a validator FhirValidator validator = ctx.newValidator(); FhirInstanceValidator instanceValidator = new FhirInstanceValidator(validationSupportChain); validator.registerValidatorModule(instanceValidator); ``` 和前面的範例比較可知,validation support chain可以視為"客製化"vlidation module的方式,也就是說,驗證的標準(包含StructureDefinition、CodeSystem、Terminology)可以依照使用者的實際需要彈性定義(範例還是以FhirContext為基礎,拆分profiles與Terminology)。 validation suport chain是由`IValidationSupport`所組成,換句話說,StructureDefinition和Terminology都可以實作對應的`IValidationSupport`。 `NpmPackageValidationSupport`和`LocalFileValidationSupport `都是Validation Support Modules的實作案例。[Validation Support Modules](https://hapifhir.io/hapi-fhir/docs/validation/validation_support_modules.html)可以找到相關參考資料。 舉例來說,如果我們要開發一個使用TW Core IG的Validator,我們就要使用`NpmPackageValidationSupport`相關程式範例如下: ``` // Create a validator and register it with the context FhirValidator validator = ctx.newValidator(); NpmPackageValidationSupport npmPackageSupport1 = new NpmPackageValidationSupport(ctx); npmPackageSupport.loadPackageFromClasspath("classpath:profiles/tw-core-ig/v0.2.1/package.tgz"); // Create a validation support chain ValidationSupportChain validationSupportChain = new ( npmPackageSupport, new DefaultProfileValidationSupport(ctx), new InMemoryTerminologyServerValidationSupport(ctx), new CommonCodeSystemsTerminologyService(ctx), new SnapshotGeneratingValidationSupport(ctx)); // Set the chain on the validator FhirInstanceValidator instanceValidator = new FhirInstanceValidator(validationSupportChain); validator.registerValidatorModule(instanceValidator); ``` 程式邏輯其實完全一樣,唯一的差別在於使用`NpmPackageValidationSupport`產生適用於TW Core IG的Validation Support Modules。