From 77ec35443f73329fe462c5627b35fd21eefb7e1e Mon Sep 17 00:00:00 2001 From: Daniel Gray Date: Fri, 22 Jan 2021 11:01:12 +0100 Subject: [PATCH] Avoid NullPointerException when customChange has no "class" attribute --- .../liquibase/change/custom/CustomChangeWrapper.java | 6 +++++- .../change/custom/CustomChangeWrapperTest.groovy | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/liquibase-core/src/main/java/liquibase/change/custom/CustomChangeWrapper.java b/liquibase-core/src/main/java/liquibase/change/custom/CustomChangeWrapper.java index 6dad50eb6ca..efa9486f3d3 100644 --- a/liquibase-core/src/main/java/liquibase/change/custom/CustomChangeWrapper.java +++ b/liquibase-core/src/main/java/liquibase/change/custom/CustomChangeWrapper.java @@ -285,7 +285,11 @@ public String getSerializedObjectNamespace() { @Override public void load(ParsedNode parsedNode, ResourceAccessor resourceAccessor) throws ParsedNodeException { try { - setClass(parsedNode.getChildValue(null, "class", String.class)); + String classNameValue = parsedNode.getChildValue(null, "class", String.class); + if (classNameValue == null) { + throw new ParsedNodeException("Custom change node has no 'class' attribute!"); + } + setClass(classNameValue); } catch (CustomChangeException e) { throw new ParsedNodeException(e); } diff --git a/liquibase-core/src/test/groovy/liquibase/change/custom/CustomChangeWrapperTest.groovy b/liquibase-core/src/test/groovy/liquibase/change/custom/CustomChangeWrapperTest.groovy index dfe7eb04227..1c6748675bc 100644 --- a/liquibase-core/src/test/groovy/liquibase/change/custom/CustomChangeWrapperTest.groovy +++ b/liquibase-core/src/test/groovy/liquibase/change/custom/CustomChangeWrapperTest.groovy @@ -257,6 +257,16 @@ class CustomChangeWrapperTest extends Specification { } + def "customChange without class fails expectedly"() { + when: + def node = new ParsedNode(null, "customChange") + def change = new CustomChangeWrapper() + change.load(node, resourceSupplier.simpleResourceAccessor) + + then: + thrown(ParsedNodeException.class) + } + def "load handles params in a 'params' collection"() { when: def node = new ParsedNode(null, "customChange")