Browse Source
Upgrade to `hibernate-validator` 5.3.4 and introduce a new `MessageInterpolatorFactory` that creates a suitable `MessageInterpolator` (taking into account missing EL dependencies). Rework `ConfigurationPropertiesBindingPostProcessor` and `ValidationAutoConfiguration` to make use of the new factory. Fixes gh-7598pull/7881/merge
7 changed files with 211 additions and 2 deletions
@ -0,0 +1,83 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2017 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.springframework.boot.validation; |
||||||
|
|
||||||
|
import java.util.Collections; |
||||||
|
import java.util.LinkedHashSet; |
||||||
|
import java.util.Set; |
||||||
|
|
||||||
|
import javax.validation.MessageInterpolator; |
||||||
|
import javax.validation.Validation; |
||||||
|
import javax.validation.ValidationException; |
||||||
|
|
||||||
|
import org.springframework.beans.BeanUtils; |
||||||
|
import org.springframework.beans.BeansException; |
||||||
|
import org.springframework.beans.factory.ObjectFactory; |
||||||
|
import org.springframework.util.ClassUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* {@link ObjectFactory} that can be used to create a {@link MessageInterpolatorFactory}. |
||||||
|
* Attempts to pick the most appropriate {@link MessageInterpolator} based on the |
||||||
|
* classpath. |
||||||
|
* |
||||||
|
* @author Phillip Webb |
||||||
|
*/ |
||||||
|
public class MessageInterpolatorFactory implements ObjectFactory<MessageInterpolator> { |
||||||
|
|
||||||
|
private static final Set<String> FALLBACKS; |
||||||
|
|
||||||
|
static { |
||||||
|
Set<String> fallbacks = new LinkedHashSet<String>(); |
||||||
|
fallbacks.add("org.hibernate.validator.messageinterpolation" |
||||||
|
+ ".ParameterMessageInterpolator"); |
||||||
|
FALLBACKS = Collections.unmodifiableSet(fallbacks); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public MessageInterpolator getObject() throws BeansException { |
||||||
|
try { |
||||||
|
return Validation.byDefaultProvider().configure() |
||||||
|
.getDefaultMessageInterpolator(); |
||||||
|
} |
||||||
|
catch (ValidationException ex) { |
||||||
|
MessageInterpolator fallback = getFallback(); |
||||||
|
if (fallback != null) { |
||||||
|
return fallback; |
||||||
|
} |
||||||
|
throw ex; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private MessageInterpolator getFallback() { |
||||||
|
for (String fallback : FALLBACKS) { |
||||||
|
try { |
||||||
|
return getFallback(fallback); |
||||||
|
} |
||||||
|
catch (Exception ex) { |
||||||
|
// Swallow an continue
|
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
private MessageInterpolator getFallback(String fallback) { |
||||||
|
Class<?> interpolatorClass = ClassUtils.resolveClassName(fallback, null); |
||||||
|
Object interpolator = BeanUtils.instantiate(interpolatorClass); |
||||||
|
return (MessageInterpolator) interpolator; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,20 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2016 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. |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Utilities and classes related to validation. |
||||||
|
*/ |
||||||
|
package org.springframework.boot.validation; |
||||||
@ -0,0 +1,39 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2017 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.springframework.boot.validation; |
||||||
|
|
||||||
|
import javax.validation.MessageInterpolator; |
||||||
|
|
||||||
|
import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests for {@link MessageInterpolatorFactory}. |
||||||
|
* |
||||||
|
* @author Phillip Webb |
||||||
|
*/ |
||||||
|
public class MessageInterpolatorFactoryTests { |
||||||
|
|
||||||
|
@Test |
||||||
|
public void getObjectShouldReturnResourceBundleMessageInterpolator() { |
||||||
|
MessageInterpolator interpolator = new MessageInterpolatorFactory().getObject(); |
||||||
|
assertThat(interpolator).isInstanceOf(ResourceBundleMessageInterpolator.class); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,60 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2012-2017 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.springframework.boot.validation; |
||||||
|
|
||||||
|
import javax.validation.MessageInterpolator; |
||||||
|
import javax.validation.Validation; |
||||||
|
import javax.validation.ValidationException; |
||||||
|
|
||||||
|
import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator; |
||||||
|
import org.junit.Rule; |
||||||
|
import org.junit.Test; |
||||||
|
import org.junit.rules.ExpectedException; |
||||||
|
import org.junit.runner.RunWith; |
||||||
|
|
||||||
|
import org.springframework.boot.junit.runner.classpath.ClassPathExclusions; |
||||||
|
import org.springframework.boot.junit.runner.classpath.ModifiedClassPathRunner; |
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Integration tests for {@link MessageInterpolatorFactory} without EL. |
||||||
|
* |
||||||
|
* @author Phillip Webb |
||||||
|
*/ |
||||||
|
@RunWith(ModifiedClassPathRunner.class) |
||||||
|
@ClassPathExclusions("tomcat-embed-el-*.jar") |
||||||
|
public class MessageInterpolatorFactoryWithoutElIntegrationTests { |
||||||
|
|
||||||
|
@Rule |
||||||
|
public ExpectedException thrown = ExpectedException.none(); |
||||||
|
|
||||||
|
@Test |
||||||
|
public void defaultMessageInterpolatorShouldFail() throws Exception { |
||||||
|
// Sanity test
|
||||||
|
this.thrown.expect(ValidationException.class); |
||||||
|
this.thrown.expectMessage("javax.el.ExpressionFactory"); |
||||||
|
Validation.byDefaultProvider().configure().getDefaultMessageInterpolator(); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void getObjectShouldUseFallback() { |
||||||
|
MessageInterpolator interpolator = new MessageInterpolatorFactory().getObject(); |
||||||
|
assertThat(interpolator).isInstanceOf(ParameterMessageInterpolator.class); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
Loading…
Reference in new issue