diff --git a/mybatis-spring-boot-autoconfigure/src/main/java/org/mybatis/spring/boot/autoconfigure/SpringBootVFS.java b/mybatis-spring-boot-autoconfigure/src/main/java/org/mybatis/spring/boot/autoconfigure/SpringBootVFS.java index 0c7e0c02f..995c0268f 100644 --- a/mybatis-spring-boot-autoconfigure/src/main/java/org/mybatis/spring/boot/autoconfigure/SpringBootVFS.java +++ b/mybatis-spring-boot-autoconfigure/src/main/java/org/mybatis/spring/boot/autoconfigure/SpringBootVFS.java @@ -1,5 +1,5 @@ /* - * Copyright 2015-2021 the original author or authors. + * Copyright 2015-2022 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. @@ -18,6 +18,8 @@ import java.io.IOException; import java.io.UncheckedIOException; import java.net.URL; +import java.net.URLDecoder; +import java.nio.charset.Charset; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -34,8 +36,13 @@ */ public class SpringBootVFS extends VFS { + private static Charset urlDecodingCharset; private final ResourcePatternResolver resourceResolver; + static { + setUrlDecodingCharset(Charset.defaultCharset()); + } + public SpringBootVFS() { this.resourceResolver = new PathMatchingResourcePatternResolver(getClass().getClassLoader()); } @@ -47,13 +54,27 @@ public boolean isValid() { @Override protected List list(URL url, String path) throws IOException { - String urlString = url.toString(); + String urlString = URLDecoder.decode(url.toString(), urlDecodingCharset.name()); String baseUrlString = urlString.endsWith("/") ? urlString : urlString.concat("/"); Resource[] resources = resourceResolver.getResources(baseUrlString + "**/*.class"); return Stream.of(resources).map(resource -> preserveSubpackageName(baseUrlString, resource, path)) .collect(Collectors.toList()); } + /** + * Set the charset for decoding an encoded URL string. + *

+ * Default is system default charset. + *

+ * + * @param charset + * the charset for decoding an encoded URL string + * @since 2.3.0 + */ + public static void setUrlDecodingCharset(Charset charset) { + urlDecodingCharset = charset; + } + private static String preserveSubpackageName(final String baseUrlString, final Resource resource, final String rootPath) { try { diff --git a/mybatis-spring-boot-autoconfigure/src/test/java/org/mybatis/spring/boot/autoconfigure/MybatisAutoConfigurationTest.java b/mybatis-spring-boot-autoconfigure/src/test/java/org/mybatis/spring/boot/autoconfigure/MybatisAutoConfigurationTest.java index a2823f146..864b04750 100644 --- a/mybatis-spring-boot-autoconfigure/src/test/java/org/mybatis/spring/boot/autoconfigure/MybatisAutoConfigurationTest.java +++ b/mybatis-spring-boot-autoconfigure/src/test/java/org/mybatis/spring/boot/autoconfigure/MybatisAutoConfigurationTest.java @@ -873,6 +873,17 @@ void whenCustomSpringLiquibaseIsDefinedThenMybatisSqlSessionTemplateDependsOnSpr }); } + @Test + void testTypeAliasesWithMultiByteCharacterInPackageName() { + this.contextRunner + .withUserConfiguration(EmbeddedDataSourceConfiguration.class, MybatisBootMapperScanAutoConfiguration.class) + .withPropertyValues("mybatis.config-location:mybatis-config2.xml").run(context -> { + org.apache.ibatis.session.Configuration configuration = context.getBean(SqlSessionFactory.class) + .getConfiguration(); + assertThat(configuration.getTypeAliasRegistry().getTypeAliases()).containsKey("シティー"); + }); + } + @Configuration static class MultipleDataSourceConfiguration { @Bean diff --git "a/mybatis-spring-boot-autoconfigure/src/test/java/org/mybatis/spring/boot/autoconfigure/\343\203\220\343\203\252\343\203\245\343\203\274\343\202\252\343\203\226\343\202\270\343\202\247\343\202\257\343\203\210/\343\202\267\343\203\206\343\202\243\343\203\274.java" "b/mybatis-spring-boot-autoconfigure/src/test/java/org/mybatis/spring/boot/autoconfigure/\343\203\220\343\203\252\343\203\245\343\203\274\343\202\252\343\203\226\343\202\270\343\202\247\343\202\257\343\203\210/\343\202\267\343\203\206\343\202\243\343\203\274.java" new file mode 100644 index 000000000..c473b819b --- /dev/null +++ "b/mybatis-spring-boot-autoconfigure/src/test/java/org/mybatis/spring/boot/autoconfigure/\343\203\220\343\203\252\343\203\245\343\203\274\343\202\252\343\203\226\343\202\270\343\202\247\343\202\257\343\203\210/\343\202\267\343\203\206\343\202\243\343\203\274.java" @@ -0,0 +1,20 @@ +/* + * Copyright 2015-2022 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. + * 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. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.mybatis.spring.boot.autoconfigure.バリューオブジェクト; + +@SuppressWarnings("unused") +public class シティー { +} diff --git a/mybatis-spring-boot-autoconfigure/src/test/resources/mybatis-config2.xml b/mybatis-spring-boot-autoconfigure/src/test/resources/mybatis-config2.xml new file mode 100644 index 000000000..0e22a9402 --- /dev/null +++ b/mybatis-spring-boot-autoconfigure/src/test/resources/mybatis-config2.xml @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/pom.xml b/pom.xml index d413a4e63..505b60504 100644 --- a/pom.xml +++ b/pom.xml @@ -98,6 +98,14 @@ ${project.build.directory}/site-src + + org.apache.maven.plugins + maven-surefire-plugin + + + ${argLine} -Djdk.attach.allowAttachSelf -Dfile.encoding=UTF-8 + +