From 2a268f2250a1016c0c1444a9a4a467c8f2b71d32 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sun, 31 Mar 2019 12:23:33 +0200 Subject: [PATCH] Consistent local vs external resolution of https schema references Co-Authored-By: Sam Brannen See gh-22504 --- .../factory/xml/PluggableSchemaResolver.java | 26 +++++++++++-------- .../CustomNamespaceHandlerTests-context.xml | 6 ++--- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/xml/PluggableSchemaResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/xml/PluggableSchemaResolver.java index d974057b4d..f6dde6e2bb 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/xml/PluggableSchemaResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/xml/PluggableSchemaResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,18 +37,18 @@ import org.springframework.util.CollectionUtils; * {@link EntityResolver} implementation that attempts to resolve schema URLs into * local {@link ClassPathResource classpath resources} using a set of mappings files. * - *

By default, this class will look for mapping files in the classpath using the pattern: - * {@code META-INF/spring.schemas} allowing for multiple files to exist on the - * classpath at any one time. + *

By default, this class will look for mapping files in the classpath using the + * pattern: {@code META-INF/spring.schemas} allowing for multiple files to exist on + * the classpath at any one time. * - * The format of {@code META-INF/spring.schemas} is a properties - * file where each line should be of the form {@code systemId=schema-location} - * where {@code schema-location} should also be a schema file in the classpath. - * Since systemId is commonly a URL, one must be careful to escape any ':' characters - * which are treated as delimiters in properties files. + *

The format of {@code META-INF/spring.schemas} is a properties file where each line + * should be of the form {@code systemId=schema-location} where {@code schema-location} + * should also be a schema file in the classpath. Since {@code systemId} is commonly a + * URL, one must be careful to escape any ':' characters which are treated as delimiters + * in properties files. * - *

The pattern for the mapping files can be overidden using the - * {@link #PluggableSchemaResolver(ClassLoader, String)} constructor + *

The pattern for the mapping files can be overridden using the + * {@link #PluggableSchemaResolver(ClassLoader, String)} constructor. * * @author Rob Harrop * @author Juergen Hoeller @@ -108,6 +108,10 @@ public class PluggableSchemaResolver implements EntityResolver { if (systemId != null) { String resourceLocation = getSchemaMappings().get(systemId); + if (resourceLocation == null && systemId.startsWith("https:")) { + // Retrieve canonical http schema mapping even for https declaration + resourceLocation = getSchemaMappings().get("http:" + systemId.substring(6)); + } if (resourceLocation != null) { Resource resource = new ClassPathResource(resourceLocation, this.classLoader); try { diff --git a/spring-context/src/test/java/org/springframework/beans/factory/xml/support/CustomNamespaceHandlerTests-context.xml b/spring-context/src/test/java/org/springframework/beans/factory/xml/support/CustomNamespaceHandlerTests-context.xml index 17c9c7e8f5..46f6111b93 100644 --- a/spring-context/src/test/java/org/springframework/beans/factory/xml/support/CustomNamespaceHandlerTests-context.xml +++ b/spring-context/src/test/java/org/springframework/beans/factory/xml/support/CustomNamespaceHandlerTests-context.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:test="http://www.springframework.org/schema/beans/test" xmlns:util="http://www.springframework.org/schema/util" - xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd - http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd - http://www.springframework.org/schema/beans/test http://www.springframework.org/schema/beans/factory/xml/support/CustomNamespaceHandlerTests.xsd" + xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-2.0.xsd + http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util-2.0.xsd + http://www.springframework.org/schema/beans/test https://www.springframework.org/schema/beans/factory/xml/support/CustomNamespaceHandlerTests.xsd" default-lazy-init="true"> -- GitLab