More granular validation support can be provided by adding your own implementation(s) of IValidationSupport to the Repository Validation Chain.
For example, if you needed to add custom code handling for a specific code system, you could write a class like the following.
package com.example.fhir;
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.support.ConceptValidationOptions;
import ca.uhn.fhir.context.support.IValidationSupport;
import ca.uhn.fhir.context.support.IValidationSupport.IssueSeverity;
import ca.uhn.fhir.context.support.ValidationSupportContext;
import org.springframework.beans.factory.annotation.Autowired;
public class CustomValidator implements IValidationSupport {
public static FhirContext ourFhirContext = FhirContext.forR4Cached();
public static String SYSTEM = "http://example.com/system";
public static String GOOD_CODE = "123";
public static String GOOD_DISPLAY = "code display";
public static String WARNING_CODE = "456";
public static String WARNING_MESSAGE = "this code should not be used";
public static String FATAL_CODE = "789";
@Autowired
private FhirContext myFhirContext;
@Override
public FhirContext getFhirContext() {
return myFhirContext;
}
@Override
public boolean isCodeSystemSupported(ValidationSupportContext theValidationSupportContext, String theSystem) {
return SYSTEM.equals(theSystem);
}
@Override
public CodeValidationResult validateCode(ValidationSupportContext theValidationSupportContext, ConceptValidationOptions theOptions, String theCodeSystem, String theCode, String theDisplay, String theValueSetUrl) {
if (SYSTEM.equals(theCodeSystem)) {
if (GOOD_CODE.equals(theCode)) {
return new IValidationSupport.CodeValidationResult()
.setCode(theCode)
.setDisplay(GOOD_DISPLAY);
} else if (WARNING_CODE.equals(theCode)) {
return new IValidationSupport.CodeValidationResult()
.setSeverity(IssueSeverity.WARNING)
.setMessage(WARNING_MESSAGE);
} else if (FATAL_CODE.equals(theCode)) {
return new IValidationSupport.CodeValidationResult()
.setSeverity(IssueSeverity.FATAL);
}
}
return null;
}
}
You may register these validator beans with the Storage Module in the same way as Storage Interceptors are registered: Compile the validator classes into a jar file and copy that jar file into the customerlib folder. See the "Registering An Interceptor" section on the Interceptors page for more details.
The only difference between registering a custom interceptor and registering a custom validator is the custom validator is registered using the "request_validating.bean_types" config key in the properties file
module.persistence.config.request_validating.bean_types=com.example.fhir.CustomValidator
More than one validator can be specified in a comma-separated list.
This config can also be managed in the Web Admin Console in the "Endpoint Validation: Request Validating" section of a Relational Storage Module.
You are about to leave the Smile Digital Health documentation and navigate to the Open Source HAPI-FHIR Documentation.