From a991c23db5e85f5c5f16ae45901d1f558f6b3f4a Mon Sep 17 00:00:00 2001 From: fengyuanwei Date: Thu, 21 Jan 2021 12:45:54 +0800 Subject: [PATCH] Close mapping streams after the ValidatorFactory has been built --- .../LocalValidatorFactoryBean.java | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java b/spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java index da0ef73a13..1ee174771c 100644 --- a/spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java +++ b/spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java @@ -17,8 +17,10 @@ package org.springframework.validation.beanvalidation; import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Constructor; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -290,13 +292,17 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter if (this.parameterNameDiscoverer != null) { configureParameterNameProvider(this.parameterNameDiscoverer, configuration); } - + List mappingStreams = null; if (this.mappingLocations != null) { + mappingStreams = new ArrayList<>(mappingLocations.length); for (Resource location : this.mappingLocations) { try { - configuration.addMapping(location.getInputStream()); + InputStream stream = location.getInputStream(); + mappingStreams.add(stream); + configuration.addMapping(stream); } catch (IOException ex) { + closeMappingStreams(mappingStreams); throw new IllegalStateException("Cannot read mapping resource: " + location); } } @@ -307,8 +313,25 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter // Allow for custom post-processing before we actually build the ValidatorFactory. postProcessConfiguration(configuration); - this.validatorFactory = configuration.buildValidatorFactory(); - setTargetValidator(this.validatorFactory.getValidator()); + try { + this.validatorFactory = configuration.buildValidatorFactory(); + setTargetValidator(this.validatorFactory.getValidator()); + } + finally { + closeMappingStreams(mappingStreams); + } + } + + private void closeMappingStreams(@Nullable List mappingStreams){ + if (!CollectionUtils.isEmpty(mappingStreams)) { + for (InputStream stream : mappingStreams) { + try { + stream.close(); + } + catch (IOException ignored) { + } + } + } } private void configureParameterNameProvider(ParameterNameDiscoverer discoverer, Configuration configuration) {