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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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