-
Notifications
You must be signed in to change notification settings - Fork 38.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Avoid MessageFormat processing for default Bean Validation messages
Closes gh-22761
- Loading branch information
Showing
7 changed files
with
123 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
/* | ||
* Copyright 2002-2017 the original author or authors. | ||
* Copyright 2002-2019 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. | ||
|
@@ -34,6 +34,7 @@ | |
import javax.validation.Constraint; | ||
import javax.validation.ConstraintValidator; | ||
import javax.validation.ConstraintValidatorContext; | ||
import javax.validation.ConstraintViolation; | ||
import javax.validation.Payload; | ||
import javax.validation.Valid; | ||
import javax.validation.Validation; | ||
|
@@ -50,11 +51,13 @@ | |
import org.springframework.context.support.StaticMessageSource; | ||
import org.springframework.util.ObjectUtils; | ||
import org.springframework.validation.BeanPropertyBindingResult; | ||
import org.springframework.validation.FieldError; | ||
import org.springframework.validation.beanvalidation.SpringValidatorAdapter; | ||
|
||
import static java.lang.annotation.ElementType.*; | ||
import static java.lang.annotation.RetentionPolicy.*; | ||
import static org.hamcrest.core.Is.*; | ||
import static org.hamcrest.core.StringContains.*; | ||
import static org.junit.Assert.*; | ||
|
||
/** | ||
|
@@ -73,7 +76,7 @@ public class SpringValidatorAdapterTests { | |
@Before | ||
public void setupSpringValidatorAdapter() { | ||
messageSource.addMessage("Size", Locale.ENGLISH, "Size of {0} is must be between {2} and {1}"); | ||
messageSource.addMessage("Same", Locale.ENGLISH, "{2} must be same value with {1}"); | ||
messageSource.addMessage("Same", Locale.ENGLISH, "{2} must be same value as {1}"); | ||
messageSource.addMessage("password", Locale.ENGLISH, "Password"); | ||
messageSource.addMessage("confirmPassword", Locale.ENGLISH, "Password(Confirm)"); | ||
} | ||
|
@@ -96,8 +99,11 @@ public void testNoStringArgumentValue() { | |
|
||
assertThat(errors.getFieldErrorCount("password"), is(1)); | ||
assertThat(errors.getFieldValue("password"), is("pass")); | ||
assertThat(messageSource.getMessage(errors.getFieldError("password"), Locale.ENGLISH), | ||
is("Size of Password is must be between 8 and 128")); | ||
FieldError error = errors.getFieldError("password"); | ||
assertNotNull(error); | ||
assertThat(messageSource.getMessage(error, Locale.ENGLISH), is("Size of Password is must be between 8 and 128")); | ||
assertTrue(error.contains(ConstraintViolation.class)); | ||
assertThat(error.unwrap(ConstraintViolation.class).getPropertyPath().toString(), is("password")); | ||
} | ||
|
||
@Test // SPR-13406 | ||
|
@@ -111,8 +117,11 @@ public void testApplyMessageSourceResolvableToStringArgumentValueWithResolvedLog | |
|
||
assertThat(errors.getFieldErrorCount("password"), is(1)); | ||
assertThat(errors.getFieldValue("password"), is("password")); | ||
assertThat(messageSource.getMessage(errors.getFieldError("password"), Locale.ENGLISH), | ||
is("Password must be same value with Password(Confirm)")); | ||
FieldError error = errors.getFieldError("password"); | ||
assertNotNull(error); | ||
assertThat(messageSource.getMessage(error, Locale.ENGLISH), is("Password must be same value as Password(Confirm)")); | ||
assertTrue(error.contains(ConstraintViolation.class)); | ||
assertThat(error.unwrap(ConstraintViolation.class).getPropertyPath().toString(), is("password")); | ||
} | ||
|
||
@Test // SPR-13406 | ||
|
@@ -127,10 +136,16 @@ public void testApplyMessageSourceResolvableToStringArgumentValueWithUnresolvedL | |
assertThat(errors.getFieldErrorCount("email"), is(1)); | ||
assertThat(errors.getFieldValue("email"), is("[email protected]")); | ||
assertThat(errors.getFieldErrorCount("confirmEmail"), is(1)); | ||
assertThat(messageSource.getMessage(errors.getFieldError("email"), Locale.ENGLISH), | ||
is("email must be same value with confirmEmail")); | ||
assertThat(messageSource.getMessage(errors.getFieldError("confirmEmail"), Locale.ENGLISH), | ||
is("Email required")); | ||
FieldError error1 = errors.getFieldError("email"); | ||
FieldError error2 = errors.getFieldError("confirmEmail"); | ||
assertNotNull(error1); | ||
assertNotNull(error2); | ||
assertThat(messageSource.getMessage(error1, Locale.ENGLISH), is("email must be same value as confirmEmail")); | ||
assertThat(messageSource.getMessage(error2, Locale.ENGLISH), is("Email required")); | ||
assertTrue(error1.contains(ConstraintViolation.class)); | ||
assertThat(error1.unwrap(ConstraintViolation.class).getPropertyPath().toString(), is("email")); | ||
assertTrue(error2.contains(ConstraintViolation.class)); | ||
assertThat(error2.unwrap(ConstraintViolation.class).getPropertyPath().toString(), is("confirmEmail")); | ||
} | ||
|
||
@Test // SPR-15123 | ||
|
@@ -147,10 +162,34 @@ public void testApplyMessageSourceResolvableToStringArgumentValueWithAlwaysUseMe | |
assertThat(errors.getFieldErrorCount("email"), is(1)); | ||
assertThat(errors.getFieldValue("email"), is("[email protected]")); | ||
assertThat(errors.getFieldErrorCount("confirmEmail"), is(1)); | ||
assertThat(messageSource.getMessage(errors.getFieldError("email"), Locale.ENGLISH), | ||
is("email must be same value with confirmEmail")); | ||
assertThat(messageSource.getMessage(errors.getFieldError("confirmEmail"), Locale.ENGLISH), | ||
is("Email required")); | ||
FieldError error1 = errors.getFieldError("email"); | ||
FieldError error2 = errors.getFieldError("confirmEmail"); | ||
assertNotNull(error1); | ||
assertNotNull(error2); | ||
assertThat(messageSource.getMessage(error1, Locale.ENGLISH), is("email must be same value as confirmEmail")); | ||
assertThat(messageSource.getMessage(error2, Locale.ENGLISH), is("Email required")); | ||
assertTrue(error1.contains(ConstraintViolation.class)); | ||
assertThat(error1.unwrap(ConstraintViolation.class).getPropertyPath().toString(), is("email")); | ||
assertTrue(error2.contains(ConstraintViolation.class)); | ||
assertThat(error2.unwrap(ConstraintViolation.class).getPropertyPath().toString(), is("confirmEmail")); | ||
} | ||
|
||
@Test | ||
public void testPatternMessage() { | ||
TestBean testBean = new TestBean(); | ||
testBean.setEmail("X"); | ||
testBean.setConfirmEmail("X"); | ||
|
||
BeanPropertyBindingResult errors = new BeanPropertyBindingResult(testBean, "testBean"); | ||
validatorAdapter.validate(testBean, errors); | ||
|
||
assertThat(errors.getFieldErrorCount("email"), is(1)); | ||
assertThat(errors.getFieldValue("email"), is("X")); | ||
FieldError error = errors.getFieldError("email"); | ||
assertNotNull(error); | ||
assertThat(messageSource.getMessage(error, Locale.ENGLISH), containsString("[\\w.'-]{1,}@[\\w.'-]{1,}")); | ||
assertTrue(error.contains(ConstraintViolation.class)); | ||
assertThat(error.unwrap(ConstraintViolation.class).getPropertyPath().toString(), is("email")); | ||
} | ||
|
||
@Test // SPR-16177 | ||
|
@@ -243,6 +282,7 @@ static class TestBean { | |
|
||
private String confirmPassword; | ||
|
||
@Pattern(regexp = "[\\w.'-]{1,}@[\\w.'-]{1,}") | ||
private String email; | ||
|
||
@Pattern(regexp = "[\\p{L} -]*", message = "Email required") | ||
|
@@ -403,13 +443,13 @@ public static class Child { | |
|
||
private Integer id; | ||
|
||
@javax.validation.constraints.NotNull | ||
@NotNull | ||
private String name; | ||
|
||
@javax.validation.constraints.NotNull | ||
@NotNull | ||
private Integer age; | ||
|
||
@javax.validation.constraints.NotNull | ||
@NotNull | ||
private Parent parent; | ||
|
||
public Integer getId() { | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters