private static void diffNodeTrees(final ObjectMapper objectMapper, final JsonNode node1, final JsonNode node2) {
        try {
            final String node1Yaml = objectMapper.writeValueAsString(node1);
            final String node2Yaml = objectMapper.writeValueAsString(node2);
            DiffUtil.unifiedDiff(node1Yaml, node2Yaml, true, 3);
        } catch (IOException e) {
            LOGGER.debug("Error writing node tree to string: " + e.getMessage(), e);
        }
    }
Merges a sparse JsonNode tree with a fully populated default jsonNode tree. Missing nodes will be added.
Nodes that are null and are a branch in the default tree are replaced with the corresponding node from
the default tree. Nodes that are null but are a leaf in the default tree are left as is and treated as
explicit nulls.

@param valueType           The POJO type to convert the merged yaml into.
@param yamlObjectMapper    The {@link ObjectMapper} to use for (de)serialisation.
@param sparseTreeProvider  A function to produce a {@link JsonNode} tree of the sparse yaml. Allows you to
                           create the node tree from file/string/stream/etc.
@param defaultTreeProvider A function to produce a {@link JsonNode} tree of the default yaml. Allows you to*
                           create the node tree from file/string/stream/etc.
@param <T>                 The POJO type to convert the merged yaml into.
@return The merged yaml de-serialised into T.
stroom-util/src/main/java/stroom/util/yaml/YamlUtil.java