Browse Source

Temporarily set LocaleContextHolder to provide validation message interpolator with locale context (fixes SPR-17231).

pull/29969/head
Boris Fox 3 years ago committed by rstoyanchev
parent
commit
72926c29f9
  1. 9
      spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageReaderArgumentResolver.java
  2. 26
      spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ModelAttributeMethodArgumentResolver.java

9
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageReaderArgumentResolver.java

@ -25,6 +25,7 @@ import java.util.Set;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.core.Conventions; import org.springframework.core.Conventions;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapter; import org.springframework.core.ReactiveAdapter;
@ -269,7 +270,13 @@ public abstract class AbstractMessageReaderArgumentResolver extends HandlerMetho
String name = Conventions.getVariableNameForParameter(param); String name = Conventions.getVariableNameForParameter(param);
WebExchangeDataBinder binder = binding.createDataBinder(exchange, target, name); WebExchangeDataBinder binder = binding.createDataBinder(exchange, target, name);
binder.validate(validationHints); try {
LocaleContextHolder.setLocaleContext(exchange.getLocaleContext());
binder.validate(validationHints);
}
finally {
LocaleContextHolder.resetLocaleContext();
}
if (binder.getBindingResult().hasErrors()) { if (binder.getBindingResult().hasErrors()) {
throw new WebExchangeBindException(param, binder.getBindingResult()); throw new WebExchangeBindException(param, binder.getBindingResult());
} }

26
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ModelAttributeMethodArgumentResolver.java

@ -26,6 +26,8 @@ import reactor.core.publisher.Mono;
import reactor.core.publisher.Sinks; import reactor.core.publisher.Sinks;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.context.i18n.LocaleContext;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapter; import org.springframework.core.ReactiveAdapter;
import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.core.ReactiveAdapterRegistry;
@ -121,7 +123,7 @@ public class ModelAttributeMethodArgumentResolver extends HandlerMethodArgumentR
return (bindingDisabled(parameter) ? Mono.empty() : bindRequestParameters(binder, exchange)) return (bindingDisabled(parameter) ? Mono.empty() : bindRequestParameters(binder, exchange))
.doOnError(bindingResultSink::tryEmitError) .doOnError(bindingResultSink::tryEmitError)
.doOnSuccess(aVoid -> { .doOnSuccess(aVoid -> {
validateIfApplicable(binder, parameter); validateIfApplicable(binder, parameter, exchange);
BindingResult bindingResult = binder.getBindingResult(); BindingResult bindingResult = binder.getBindingResult();
model.put(BindingResult.MODEL_KEY_PREFIX + name, bindingResult); model.put(BindingResult.MODEL_KEY_PREFIX + name, bindingResult);
model.put(name, value); model.put(name, value);
@ -278,11 +280,23 @@ public class ModelAttributeMethodArgumentResolver extends HandlerMethodArgumentR
return (paramTypes.length > i + 1 && Errors.class.isAssignableFrom(paramTypes[i + 1])); return (paramTypes.length > i + 1 && Errors.class.isAssignableFrom(paramTypes[i + 1]));
} }
private void validateIfApplicable(WebExchangeDataBinder binder, MethodParameter parameter) { private void validateIfApplicable(WebExchangeDataBinder binder, MethodParameter parameter, ServerWebExchange exchange) {
for (Annotation ann : parameter.getParameterAnnotations()) { LocaleContext localeContext = null;
Object[] validationHints = ValidationAnnotationUtils.determineValidationHints(ann); try {
if (validationHints != null) { for (Annotation ann : parameter.getParameterAnnotations()) {
binder.validate(validationHints); Object[] validationHints = ValidationAnnotationUtils.determineValidationHints(ann);
if (validationHints != null) {
if (localeContext == null) {
localeContext = exchange.getLocaleContext();
LocaleContextHolder.setLocaleContext(localeContext);
}
binder.validate(validationHints);
}
}
}
finally {
if (localeContext != null) {
LocaleContextHolder.resetLocaleContext();
} }
} }
} }

Loading…
Cancel
Save