Add setting to disable resource type target validation in JPA
This commit is contained in:
parent
6597a928d5
commit
ed4da7c414
|
@ -1550,15 +1550,17 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao,
|
|||
continue;
|
||||
}
|
||||
|
||||
for (IBase nextChild : values) {
|
||||
IBaseReference nextRef = (IBaseReference) nextChild;
|
||||
IIdType referencedId = nextRef.getReferenceElement();
|
||||
if (!isBlank(referencedId.getResourceType())) {
|
||||
if (!isLogicalReference(referencedId)) {
|
||||
if (!referencedId.getValue().contains("?")) {
|
||||
if (!validTypes.contains(referencedId.getResourceType())) {
|
||||
throw new UnprocessableEntityException(
|
||||
"Invalid reference found at path '" + newPath + "'. Resource type '" + referencedId.getResourceType() + "' is not valid for this path");
|
||||
if (getConfig().isEnforceReferenceTargetTypes()) {
|
||||
for (IBase nextChild : values) {
|
||||
IBaseReference nextRef = (IBaseReference) nextChild;
|
||||
IIdType referencedId = nextRef.getReferenceElement();
|
||||
if (!isBlank(referencedId.getResourceType())) {
|
||||
if (!isLogicalReference(referencedId)) {
|
||||
if (!referencedId.getValue().contains("?")) {
|
||||
if (!validTypes.contains(referencedId.getResourceType())) {
|
||||
throw new UnprocessableEntityException(
|
||||
"Invalid reference found at path '" + newPath + "'. Resource type '" + referencedId.getResourceType() + "' is not valid for this path");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,9 +26,9 @@ import java.util.*;
|
|||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
|
@ -142,6 +142,7 @@ public class DaoConfig {
|
|||
private List<WarmCacheEntry> myWarmCacheEntries = new ArrayList<>();
|
||||
private boolean myDisableHashBasedSearches;
|
||||
private boolean myEnableInMemorySubscriptionMatching = true;
|
||||
private boolean myEnforceReferenceTargetTypes = true;
|
||||
private ClientIdStrategyEnum myResourceClientIdStrategy = ClientIdStrategyEnum.ALPHANUMERIC;
|
||||
|
||||
/**
|
||||
|
@ -161,6 +162,26 @@ public class DaoConfig {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If set to <code>true</code> (default is true) when a resource is being persisted,
|
||||
* the target resource types of references will be validated to ensure that they
|
||||
* are appropriate for the field containing the reference. This is generally a good idea
|
||||
* because invalid reference target types may not be searchable.
|
||||
*/
|
||||
public boolean isEnforceReferenceTargetTypes() {
|
||||
return myEnforceReferenceTargetTypes;
|
||||
}
|
||||
|
||||
/**
|
||||
* If set to <code>true</code> (default is true) when a resource is being persisted,
|
||||
* the target resource types of references will be validated to ensure that they
|
||||
* are appropriate for the field containing the reference. This is generally a good idea
|
||||
* because invalid reference target types may not be searchable.
|
||||
*/
|
||||
public void setEnforceReferenceTargetTypes(boolean theEnforceReferenceTargetTypes) {
|
||||
myEnforceReferenceTargetTypes = theEnforceReferenceTargetTypes;
|
||||
}
|
||||
|
||||
/**
|
||||
* If a non-null value is supplied (default is <code>null</code>), a default
|
||||
* for the <code>_total</code> parameter may be specified here. For example,
|
||||
|
@ -1392,6 +1413,7 @@ public class DaoConfig {
|
|||
/**
|
||||
* If set to <code>true</code> (default is true) the server will match incoming resources against active subscriptions
|
||||
* and send them to the subscription channel. If set to <code>false</code> no matching or sending occurs.
|
||||
*
|
||||
* @since 3.7.0
|
||||
*/
|
||||
|
||||
|
@ -1402,6 +1424,7 @@ public class DaoConfig {
|
|||
/**
|
||||
* If set to <code>true</code> (default is true) the server will match incoming resources against active subscriptions
|
||||
* and send them to the subscription channel. If set to <code>false</code> no matching or sending occurs.
|
||||
*
|
||||
* @since 3.7.0
|
||||
*/
|
||||
|
||||
|
|
|
@ -73,6 +73,7 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
|
|||
myDaoConfig.setAllowExternalReferences(new DaoConfig().isAllowExternalReferences());
|
||||
myDaoConfig.setTreatReferencesAsLogical(new DaoConfig().getTreatReferencesAsLogical());
|
||||
myDaoConfig.setEnforceReferentialIntegrityOnDelete(new DaoConfig().isEnforceReferentialIntegrityOnDelete());
|
||||
myDaoConfig.setEnforceReferenceTargetTypes(new DaoConfig().isEnforceReferenceTargetTypes());
|
||||
}
|
||||
|
||||
private void assertGone(IIdType theId) {
|
||||
|
@ -945,6 +946,13 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test {
|
|||
assertEquals("Resource Organization/testCreateWithIllegalReference not found, specified in path: Patient.managingOrganization", e.getMessage());
|
||||
}
|
||||
|
||||
// Disable validation
|
||||
myDaoConfig.setEnforceReferenceTargetTypes(false);
|
||||
Patient p = new Patient();
|
||||
p.getManagingOrganization().setReferenceElement(id1);
|
||||
myPatientDao.create(p, mySrd);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -73,6 +73,10 @@
|
|||
(e.g. "Patient?identifier=&identifier=b" returned no results even if resources
|
||||
should have matched. Thanks to @mingdatacom for reporting!
|
||||
</action>
|
||||
<action type="add">
|
||||
A new config setting has been added to the JPA DaoConfig that disables validation
|
||||
of the resource type for target resources in references.
|
||||
</action>
|
||||
</release>
|
||||
<release version="3.7.0" date="2019-02-06" description="Gale">
|
||||
<action type="add">
|
||||
|
|
Loading…
Reference in New Issue