Home / Class/ MessageSourceMessageInterpolatorIntegrationTests Class — spring-boot Architecture

MessageSourceMessageInterpolatorIntegrationTests Class — spring-boot Architecture

Architecture documentation for the MessageSourceMessageInterpolatorIntegrationTests class in MessageSourceMessageInterpolatorIntegrationTests.java from the spring-boot codebase.

Entity Profile

Source Code

core/spring-boot/src/test/java/org/springframework/boot/validation/MessageSourceMessageInterpolatorIntegrationTests.java lines 42–164

class MessageSourceMessageInterpolatorIntegrationTests {

	@NotNull
	@SuppressWarnings("NullAway.Init")
	private String defaultMessage;

	@NotNull(message = "{null}")
	@SuppressWarnings("NullAway.Init")
	private String nullable;

	@NotNull(message = "{blank}")
	@SuppressWarnings("NullAway.Init")
	private String blank;

	@NotNull(message = "{unknown}")
	@SuppressWarnings("NullAway.Init")
	private String unknown;

	@NotNull(message = "{recursion}")
	@SuppressWarnings("NullAway.Init")
	private String recursion;

	@NotNull(message = "\\{null}")
	@SuppressWarnings("NullAway.Init")
	private String escapePrefix;

	@NotNull(message = "{null\\}")
	@SuppressWarnings("NullAway.Init")
	private String escapeSuffix;

	@NotNull(message = "\\{null\\}")
	@SuppressWarnings("NullAway.Init")
	private String escapePrefixSuffix;

	@NotNull(message = "\\\\{null}")
	@SuppressWarnings("NullAway.Init")
	private String escapeEscape;

	@Test
	void defaultMessage() {
		assertThat(validate("defaultMessage")).containsExactly("must not be null");
	}

	@Test
	void nullable() {
		assertThat(validate("nullable")).containsExactly("must not be null");
	}

	@Test
	void blank() {
		assertThat(validate("blank")).containsExactly("must not be null or must not be blank");
	}

	@Test
	void recursion() {
		assertThatException().isThrownBy(() -> validate("recursion"))
			.withStackTraceContaining("Circular reference '{recursion -> middle -> recursion}'");
	}

	@Test
	void unknown() {
		assertThat(validate("unknown")).containsExactly("{unknown}");
	}

	@Test
	void escapePrefix() {
		assertThat(validate("escapePrefix")).containsExactly("\\{null}");
	}

	@Test
	void escapeSuffix() {
		assertThat(validate("escapeSuffix")).containsExactly("{null\\}");
	}

	@Test
	void escapePrefixSuffix() {
		assertThat(validate("escapePrefixSuffix")).containsExactly("{null}");
	}

	@Test
	void escapeEscape() {
		assertThat(validate("escapeEscape")).containsExactly("\\must not be null");
	}

	private List<String> validate(String property) {
		return withEnglishLocale(() -> {
			Validator validator = buildValidator();
			List<String> messages = new ArrayList<>();
			Set<ConstraintViolation<Object>> constraints = validator.validateProperty(this, property);
			for (ConstraintViolation<Object> constraint : constraints) {
				messages.add(constraint.getMessage());
			}
			return messages;
		});
	}

	private static Validator buildValidator() {
		Locale locale = LocaleContextHolder.getLocale();
		StaticMessageSource messageSource = new StaticMessageSource();
		messageSource.addMessage("blank", locale, "{null} or {jakarta.validation.constraints.NotBlank.message}");
		messageSource.addMessage("null", locale, "{jakarta.validation.constraints.NotNull.message}");
		messageSource.addMessage("recursion", locale, "{middle}");
		messageSource.addMessage("middle", locale, "{recursion}");
		MessageInterpolatorFactory messageInterpolatorFactory = new MessageInterpolatorFactory(messageSource);
		try (LocalValidatorFactoryBean validatorFactory = new LocalValidatorFactoryBean()) {
			validatorFactory.setMessageInterpolator(messageInterpolatorFactory.getObject());
			validatorFactory.afterPropertiesSet();
			return validatorFactory.getValidator();
		}
	}

	private static <T> T withEnglishLocale(Supplier<T> supplier) {
		Locale defaultLocale = Locale.getDefault();
		try {
			Locale.setDefault(Locale.ENGLISH);
			return supplier.get();
		}
		finally {
			Locale.setDefault(defaultLocale);
		}
	}

}

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free