Declare interfaces as @FunctionalInterface where feasible
This commit declares each of the following public interfaces as a @FunctionalInterface. - org.springframework.context.ApplicationContextInitializer - org.springframework.test.web.servlet.DispatcherServletCustomizer - org.springframework.validation.MessageCodeFormatter - org.springframework.util.IdGenerator - org.springframework.beans.factory.config.YamlProcessor.MatchCallback - org.springframework.beans.factory.config.YamlProcessor.DocumentMatcher Closes gh-25580
This commit is contained in:
parent
596936f18c
commit
c558391e2c
|
@ -351,6 +351,7 @@ public abstract class YamlProcessor {
|
||||||
/**
|
/**
|
||||||
* Callback interface used to process the YAML parsing results.
|
* Callback interface used to process the YAML parsing results.
|
||||||
*/
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
public interface MatchCallback {
|
public interface MatchCallback {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -367,6 +368,7 @@ public abstract class YamlProcessor {
|
||||||
/**
|
/**
|
||||||
* Strategy interface used to test if properties match.
|
* Strategy interface used to test if properties match.
|
||||||
*/
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
public interface DocumentMatcher {
|
public interface DocumentMatcher {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2019 the original author or authors.
|
* Copyright 2002-2020 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -24,7 +24,6 @@ import org.yaml.snakeyaml.Yaml;
|
||||||
import org.yaml.snakeyaml.constructor.DuplicateKeyException;
|
import org.yaml.snakeyaml.constructor.DuplicateKeyException;
|
||||||
import org.yaml.snakeyaml.scanner.ScannerException;
|
import org.yaml.snakeyaml.scanner.ScannerException;
|
||||||
|
|
||||||
import org.springframework.beans.factory.config.YamlProcessor.DocumentMatcher;
|
|
||||||
import org.springframework.beans.factory.config.YamlProcessor.MatchStatus;
|
import org.springframework.beans.factory.config.YamlProcessor.MatchStatus;
|
||||||
import org.springframework.beans.factory.config.YamlProcessor.ResolutionMethod;
|
import org.springframework.beans.factory.config.YamlProcessor.ResolutionMethod;
|
||||||
import org.springframework.core.io.ByteArrayResource;
|
import org.springframework.core.io.ByteArrayResource;
|
||||||
|
@ -39,10 +38,10 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||||
* @author Dave Syer
|
* @author Dave Syer
|
||||||
* @author Juergen Hoeller
|
* @author Juergen Hoeller
|
||||||
*/
|
*/
|
||||||
public class YamlPropertiesFactoryBeanTests {
|
class YamlPropertiesFactoryBeanTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadResource() {
|
void loadResource() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResources(new ByteArrayResource("foo: bar\nspam:\n foo: baz".getBytes()));
|
factory.setResources(new ByteArrayResource("foo: bar\nspam:\n foo: baz".getBytes()));
|
||||||
Properties properties = factory.getObject();
|
Properties properties = factory.getObject();
|
||||||
|
@ -51,7 +50,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void badResource() {
|
void badResource() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResources(new ByteArrayResource("foo: bar\ncd\nspam:\n foo: baz".getBytes()));
|
factory.setResources(new ByteArrayResource("foo: bar\ncd\nspam:\n foo: baz".getBytes()));
|
||||||
assertThatExceptionOfType(ScannerException.class)
|
assertThatExceptionOfType(ScannerException.class)
|
||||||
|
@ -60,7 +59,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadResourcesWithOverride() {
|
void loadResourcesWithOverride() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResources(
|
factory.setResources(
|
||||||
new ByteArrayResource("foo: bar\nspam:\n foo: baz".getBytes()),
|
new ByteArrayResource("foo: bar\nspam:\n foo: baz".getBytes()),
|
||||||
|
@ -72,7 +71,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadResourcesWithInternalOverride() {
|
void loadResourcesWithInternalOverride() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResources(new ByteArrayResource(
|
factory.setResources(new ByteArrayResource(
|
||||||
"foo: bar\nspam:\n foo: baz\nfoo: bucket".getBytes()));
|
"foo: bar\nspam:\n foo: baz\nfoo: bucket".getBytes()));
|
||||||
|
@ -80,7 +79,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadResourcesWithNestedInternalOverride() {
|
void loadResourcesWithNestedInternalOverride() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResources(new ByteArrayResource(
|
factory.setResources(new ByteArrayResource(
|
||||||
"foo:\n bar: spam\n foo: baz\nbreak: it\nfoo: bucket".getBytes()));
|
"foo:\n bar: spam\n foo: baz\nbreak: it\nfoo: bucket".getBytes()));
|
||||||
|
@ -88,7 +87,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadResourceWithMultipleDocuments() {
|
void loadResourceWithMultipleDocuments() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResources(new ByteArrayResource(
|
factory.setResources(new ByteArrayResource(
|
||||||
"foo: bar\nspam: baz\n---\nfoo: bag".getBytes()));
|
"foo: bar\nspam: baz\n---\nfoo: bag".getBytes()));
|
||||||
|
@ -98,7 +97,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadResourceWithSelectedDocuments() {
|
void loadResourceWithSelectedDocuments() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResources(new ByteArrayResource(
|
factory.setResources(new ByteArrayResource(
|
||||||
"foo: bar\nspam: baz\n---\nfoo: bag\nspam: bad".getBytes()));
|
"foo: bar\nspam: baz\n---\nfoo: bag\nspam: bad".getBytes()));
|
||||||
|
@ -110,7 +109,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadResourceWithDefaultMatch() {
|
void loadResourceWithDefaultMatch() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setMatchDefault(true);
|
factory.setMatchDefault(true);
|
||||||
factory.setResources(new ByteArrayResource(
|
factory.setResources(new ByteArrayResource(
|
||||||
|
@ -129,20 +128,17 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadResourceWithoutDefaultMatch() {
|
void loadResourceWithoutDefaultMatch() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setMatchDefault(false);
|
factory.setMatchDefault(false);
|
||||||
factory.setResources(new ByteArrayResource(
|
factory.setResources(new ByteArrayResource(
|
||||||
"one: two\n---\nfoo: bar\nspam: baz\n---\nfoo: bag\nspam: bad".getBytes()));
|
"one: two\n---\nfoo: bar\nspam: baz\n---\nfoo: bag\nspam: bad".getBytes()));
|
||||||
factory.setDocumentMatchers(new DocumentMatcher() {
|
factory.setDocumentMatchers(properties -> {
|
||||||
@Override
|
|
||||||
public MatchStatus matches(Properties properties) {
|
|
||||||
if (!properties.containsKey("foo")) {
|
if (!properties.containsKey("foo")) {
|
||||||
return MatchStatus.ABSTAIN;
|
return MatchStatus.ABSTAIN;
|
||||||
}
|
}
|
||||||
return ("bag".equals(properties.getProperty("foo")) ?
|
return ("bag".equals(properties.getProperty("foo")) ?
|
||||||
MatchStatus.FOUND : MatchStatus.NOT_FOUND);
|
MatchStatus.FOUND : MatchStatus.NOT_FOUND);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
Properties properties = factory.getObject();
|
Properties properties = factory.getObject();
|
||||||
assertThat(properties.getProperty("foo")).isEqualTo("bag");
|
assertThat(properties.getProperty("foo")).isEqualTo("bag");
|
||||||
|
@ -151,7 +147,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadResourceWithDefaultMatchSkippingMissedMatch() {
|
void loadResourceWithDefaultMatchSkippingMissedMatch() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setMatchDefault(true);
|
factory.setMatchDefault(true);
|
||||||
factory.setResources(new ByteArrayResource(
|
factory.setResources(new ByteArrayResource(
|
||||||
|
@ -170,7 +166,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadNonExistentResource() {
|
void loadNonExistentResource() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResolutionMethod(ResolutionMethod.OVERRIDE_AND_IGNORE);
|
factory.setResolutionMethod(ResolutionMethod.OVERRIDE_AND_IGNORE);
|
||||||
factory.setResources(new ClassPathResource("no-such-file.yml"));
|
factory.setResources(new ClassPathResource("no-such-file.yml"));
|
||||||
|
@ -179,7 +175,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadNull() {
|
void loadNull() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResources(new ByteArrayResource("foo: bar\nspam:".getBytes()));
|
factory.setResources(new ByteArrayResource("foo: bar\nspam:".getBytes()));
|
||||||
Properties properties = factory.getObject();
|
Properties properties = factory.getObject();
|
||||||
|
@ -188,7 +184,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadEmptyArrayValue() {
|
void loadEmptyArrayValue() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResources(new ByteArrayResource("a: alpha\ntest: []".getBytes()));
|
factory.setResources(new ByteArrayResource("a: alpha\ntest: []".getBytes()));
|
||||||
Properties properties = factory.getObject();
|
Properties properties = factory.getObject();
|
||||||
|
@ -197,7 +193,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadArrayOfString() {
|
void loadArrayOfString() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResources(new ByteArrayResource("foo:\n- bar\n- baz".getBytes()));
|
factory.setResources(new ByteArrayResource("foo:\n- bar\n- baz".getBytes()));
|
||||||
Properties properties = factory.getObject();
|
Properties properties = factory.getObject();
|
||||||
|
@ -207,7 +203,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadArrayOfInteger() {
|
void loadArrayOfInteger() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResources(new ByteArrayResource("foo:\n- 1\n- 2".getBytes()));
|
factory.setResources(new ByteArrayResource("foo:\n- 1\n- 2".getBytes()));
|
||||||
Properties properties = factory.getObject();
|
Properties properties = factory.getObject();
|
||||||
|
@ -217,7 +213,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void loadArrayOfObject() {
|
void loadArrayOfObject() {
|
||||||
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
|
||||||
factory.setResources(new ByteArrayResource(
|
factory.setResources(new ByteArrayResource(
|
||||||
"foo:\n- bar:\n spam: crap\n- baz\n- one: two\n three: four".getBytes()
|
"foo:\n- bar:\n spam: crap\n- baz\n- one: two\n three: four".getBytes()
|
||||||
|
@ -232,7 +228,7 @@ public class YamlPropertiesFactoryBeanTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void yaml() {
|
void yaml() {
|
||||||
Yaml yaml = new Yaml();
|
Yaml yaml = new Yaml();
|
||||||
Map<String, ?> map = yaml.loadAs("foo: bar\nspam:\n foo: baz", Map.class);
|
Map<String, ?> map = yaml.loadAs("foo: bar\nspam:\n foo: baz", Map.class);
|
||||||
assertThat(map.get("foo")).isEqualTo("bar");
|
assertThat(map.get("foo")).isEqualTo("bar");
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2018 the original author or authors.
|
* Copyright 2002-2020 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -28,7 +28,7 @@ package org.springframework.context;
|
||||||
*
|
*
|
||||||
* <p>{@code ApplicationContextInitializer} processors are encouraged to detect
|
* <p>{@code ApplicationContextInitializer} processors are encouraged to detect
|
||||||
* whether Spring's {@link org.springframework.core.Ordered Ordered} interface has been
|
* whether Spring's {@link org.springframework.core.Ordered Ordered} interface has been
|
||||||
* implemented or if the @{@link org.springframework.core.annotation.Order Order}
|
* implemented or if the {@link org.springframework.core.annotation.Order @Order}
|
||||||
* annotation is present and to sort instances accordingly if so prior to invocation.
|
* annotation is present and to sort instances accordingly if so prior to invocation.
|
||||||
*
|
*
|
||||||
* @author Chris Beams
|
* @author Chris Beams
|
||||||
|
@ -39,6 +39,7 @@ package org.springframework.context;
|
||||||
* @see org.springframework.web.servlet.FrameworkServlet#setContextInitializerClasses
|
* @see org.springframework.web.servlet.FrameworkServlet#setContextInitializerClasses
|
||||||
* @see org.springframework.web.servlet.FrameworkServlet#applyInitializers
|
* @see org.springframework.web.servlet.FrameworkServlet#applyInitializers
|
||||||
*/
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {
|
public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2018 the original author or authors.
|
* Copyright 2002-2020 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -26,6 +26,7 @@ import org.springframework.lang.Nullable;
|
||||||
* @see DefaultMessageCodesResolver
|
* @see DefaultMessageCodesResolver
|
||||||
* @see DefaultMessageCodesResolver.Format
|
* @see DefaultMessageCodesResolver.Format
|
||||||
*/
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
public interface MessageCodeFormatter {
|
public interface MessageCodeFormatter {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2019 the original author or authors.
|
* Copyright 2002-2020 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -28,22 +28,20 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
*/
|
*/
|
||||||
public class DefaultMessageCodesResolverTests {
|
class DefaultMessageCodesResolverTests {
|
||||||
|
|
||||||
|
private final DefaultMessageCodesResolver resolver = new DefaultMessageCodesResolver();
|
||||||
|
|
||||||
private DefaultMessageCodesResolver resolver = new DefaultMessageCodesResolver();
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldResolveMessageCode() throws Exception {
|
void shouldResolveMessageCode() throws Exception {
|
||||||
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName");
|
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName");
|
||||||
assertThat(codes).containsExactly(
|
assertThat(codes).containsExactly("errorCode.objectName", "errorCode");
|
||||||
"errorCode.objectName",
|
|
||||||
"errorCode");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldResolveFieldMessageCode() throws Exception {
|
void shouldResolveFieldMessageCode() throws Exception {
|
||||||
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "field",
|
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "field", TestBean.class);
|
||||||
TestBean.class);
|
|
||||||
assertThat(codes).containsExactly(
|
assertThat(codes).containsExactly(
|
||||||
"errorCode.objectName.field",
|
"errorCode.objectName.field",
|
||||||
"errorCode.field",
|
"errorCode.field",
|
||||||
|
@ -52,9 +50,8 @@ public class DefaultMessageCodesResolverTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldResolveIndexedFieldMessageCode() throws Exception {
|
void shouldResolveIndexedFieldMessageCode() throws Exception {
|
||||||
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "a.b[3].c[5].d",
|
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "a.b[3].c[5].d", TestBean.class);
|
||||||
TestBean.class);
|
|
||||||
assertThat(codes).containsExactly(
|
assertThat(codes).containsExactly(
|
||||||
"errorCode.objectName.a.b[3].c[5].d",
|
"errorCode.objectName.a.b[3].c[5].d",
|
||||||
"errorCode.objectName.a.b[3].c.d",
|
"errorCode.objectName.a.b[3].c.d",
|
||||||
|
@ -68,19 +65,16 @@ public class DefaultMessageCodesResolverTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldResolveMessageCodeWithPrefix() throws Exception {
|
void shouldResolveMessageCodeWithPrefix() throws Exception {
|
||||||
resolver.setPrefix("prefix.");
|
resolver.setPrefix("prefix.");
|
||||||
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName");
|
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName");
|
||||||
assertThat(codes).containsExactly(
|
assertThat(codes).containsExactly("prefix.errorCode.objectName", "prefix.errorCode");
|
||||||
"prefix.errorCode.objectName",
|
|
||||||
"prefix.errorCode");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldResolveFieldMessageCodeWithPrefix() throws Exception {
|
void shouldResolveFieldMessageCodeWithPrefix() throws Exception {
|
||||||
resolver.setPrefix("prefix.");
|
resolver.setPrefix("prefix.");
|
||||||
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "field",
|
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "field", TestBean.class);
|
||||||
TestBean.class);
|
|
||||||
assertThat(codes).containsExactly(
|
assertThat(codes).containsExactly(
|
||||||
"prefix.errorCode.objectName.field",
|
"prefix.errorCode.objectName.field",
|
||||||
"prefix.errorCode.field",
|
"prefix.errorCode.field",
|
||||||
|
@ -89,10 +83,9 @@ public class DefaultMessageCodesResolverTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldSupportNullPrefix() throws Exception {
|
void shouldSupportNullPrefix() throws Exception {
|
||||||
resolver.setPrefix(null);
|
resolver.setPrefix(null);
|
||||||
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "field",
|
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "field", TestBean.class);
|
||||||
TestBean.class);
|
|
||||||
assertThat(codes).containsExactly(
|
assertThat(codes).containsExactly(
|
||||||
"errorCode.objectName.field",
|
"errorCode.objectName.field",
|
||||||
"errorCode.field",
|
"errorCode.field",
|
||||||
|
@ -101,9 +94,8 @@ public class DefaultMessageCodesResolverTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldSupportMalformedIndexField() throws Exception {
|
void shouldSupportMalformedIndexField() throws Exception {
|
||||||
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "field[",
|
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "field[", TestBean.class);
|
||||||
TestBean.class);
|
|
||||||
assertThat(codes).containsExactly(
|
assertThat(codes).containsExactly(
|
||||||
"errorCode.objectName.field[",
|
"errorCode.objectName.field[",
|
||||||
"errorCode.field[",
|
"errorCode.field[",
|
||||||
|
@ -112,9 +104,8 @@ public class DefaultMessageCodesResolverTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldSupportNullFieldType() throws Exception {
|
void shouldSupportNullFieldType() throws Exception {
|
||||||
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "field",
|
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "field", null);
|
||||||
null);
|
|
||||||
assertThat(codes).containsExactly(
|
assertThat(codes).containsExactly(
|
||||||
"errorCode.objectName.field",
|
"errorCode.objectName.field",
|
||||||
"errorCode.field",
|
"errorCode.field",
|
||||||
|
@ -122,19 +113,16 @@ public class DefaultMessageCodesResolverTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldSupportPostfixFormat() throws Exception {
|
void shouldSupportPostfixFormat() throws Exception {
|
||||||
resolver.setMessageCodeFormatter(Format.POSTFIX_ERROR_CODE);
|
resolver.setMessageCodeFormatter(Format.POSTFIX_ERROR_CODE);
|
||||||
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName");
|
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName");
|
||||||
assertThat(codes).containsExactly(
|
assertThat(codes).containsExactly("objectName.errorCode", "errorCode");
|
||||||
"objectName.errorCode",
|
|
||||||
"errorCode");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldSupportFieldPostfixFormat() throws Exception {
|
void shouldSupportFieldPostfixFormat() throws Exception {
|
||||||
resolver.setMessageCodeFormatter(Format.POSTFIX_ERROR_CODE);
|
resolver.setMessageCodeFormatter(Format.POSTFIX_ERROR_CODE);
|
||||||
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "field",
|
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName", "field", TestBean.class);
|
||||||
TestBean.class);
|
|
||||||
assertThat(codes).containsExactly(
|
assertThat(codes).containsExactly(
|
||||||
"objectName.field.errorCode",
|
"objectName.field.errorCode",
|
||||||
"field.errorCode",
|
"field.errorCode",
|
||||||
|
@ -143,18 +131,11 @@ public class DefaultMessageCodesResolverTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldSupportCustomFormat() throws Exception {
|
void shouldSupportCustomFormat() throws Exception {
|
||||||
resolver.setMessageCodeFormatter(new MessageCodeFormatter() {
|
resolver.setMessageCodeFormatter((errorCode, objectName, field) ->
|
||||||
@Override
|
DefaultMessageCodesResolver.Format.toDelimitedString("CUSTOM-" + errorCode, objectName, field));
|
||||||
public String format(String errorCode, String objectName, String field) {
|
|
||||||
return DefaultMessageCodesResolver.Format.toDelimitedString(
|
|
||||||
"CUSTOM-" + errorCode, objectName, field);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName");
|
String[] codes = resolver.resolveMessageCodes("errorCode", "objectName");
|
||||||
assertThat(codes).containsExactly(
|
assertThat(codes).containsExactly("CUSTOM-errorCode.objectName", "CUSTOM-errorCode");
|
||||||
"CUSTOM-errorCode.objectName",
|
|
||||||
"CUSTOM-errorCode");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2015 the original author or authors.
|
* Copyright 2002-2020 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -19,11 +19,12 @@ package org.springframework.util;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contract for generating universally unique identifiers {@link UUID (UUIDs)}.
|
* Contract for generating universally unique identifiers ({@link UUID UUIDs}).
|
||||||
*
|
*
|
||||||
* @author Rossen Stoyanchev
|
* @author Rossen Stoyanchev
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
public interface IdGenerator {
|
public interface IdGenerator {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -26,7 +26,6 @@ import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.springframework.messaging.Message;
|
import org.springframework.messaging.Message;
|
||||||
import org.springframework.messaging.MessageHeaders;
|
import org.springframework.messaging.MessageHeaders;
|
||||||
import org.springframework.util.IdGenerator;
|
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||||
|
@ -36,16 +35,16 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
|
||||||
* @author Mark Fisher
|
* @author Mark Fisher
|
||||||
* @author Rossen Stoyanchev
|
* @author Rossen Stoyanchev
|
||||||
*/
|
*/
|
||||||
public class MessageBuilderTests {
|
class MessageBuilderTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSimpleMessageCreation() {
|
void simpleMessageCreation() {
|
||||||
Message<String> message = MessageBuilder.withPayload("foo").build();
|
Message<String> message = MessageBuilder.withPayload("foo").build();
|
||||||
assertThat(message.getPayload()).isEqualTo("foo");
|
assertThat(message.getPayload()).isEqualTo("foo");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testHeaderValues() {
|
void headerValues() {
|
||||||
Message<String> message = MessageBuilder.withPayload("test")
|
Message<String> message = MessageBuilder.withPayload("test")
|
||||||
.setHeader("foo", "bar")
|
.setHeader("foo", "bar")
|
||||||
.setHeader("count", 123)
|
.setHeader("count", 123)
|
||||||
|
@ -55,7 +54,7 @@ public class MessageBuilderTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCopiedHeaderValues() {
|
void copiedHeaderValues() {
|
||||||
Message<String> message1 = MessageBuilder.withPayload("test1")
|
Message<String> message1 = MessageBuilder.withPayload("test1")
|
||||||
.setHeader("foo", "1")
|
.setHeader("foo", "1")
|
||||||
.setHeader("bar", "2")
|
.setHeader("bar", "2")
|
||||||
|
@ -74,21 +73,21 @@ public class MessageBuilderTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIdHeaderValueReadOnly() {
|
void idHeaderValueReadOnly() {
|
||||||
UUID id = UUID.randomUUID();
|
UUID id = UUID.randomUUID();
|
||||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
assertThatIllegalArgumentException().isThrownBy(() ->
|
||||||
MessageBuilder.withPayload("test").setHeader(MessageHeaders.ID, id));
|
MessageBuilder.withPayload("test").setHeader(MessageHeaders.ID, id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testTimestampValueReadOnly() {
|
void timestampValueReadOnly() {
|
||||||
Long timestamp = 12345L;
|
Long timestamp = 12345L;
|
||||||
assertThatIllegalArgumentException().isThrownBy(() ->
|
assertThatIllegalArgumentException().isThrownBy(() ->
|
||||||
MessageBuilder.withPayload("test").setHeader(MessageHeaders.TIMESTAMP, timestamp).build());
|
MessageBuilder.withPayload("test").setHeader(MessageHeaders.TIMESTAMP, timestamp).build());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void copyHeadersIfAbsent() {
|
void copyHeadersIfAbsent() {
|
||||||
Message<String> message1 = MessageBuilder.withPayload("test1")
|
Message<String> message1 = MessageBuilder.withPayload("test1")
|
||||||
.setHeader("foo", "bar").build();
|
.setHeader("foo", "bar").build();
|
||||||
Message<String> message2 = MessageBuilder.withPayload("test2")
|
Message<String> message2 = MessageBuilder.withPayload("test2")
|
||||||
|
@ -100,7 +99,7 @@ public class MessageBuilderTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void createFromMessage() {
|
void createFromMessage() {
|
||||||
Message<String> message1 = MessageBuilder.withPayload("test")
|
Message<String> message1 = MessageBuilder.withPayload("test")
|
||||||
.setHeader("foo", "bar").build();
|
.setHeader("foo", "bar").build();
|
||||||
Message<String> message2 = MessageBuilder.fromMessage(message1).build();
|
Message<String> message2 = MessageBuilder.fromMessage(message1).build();
|
||||||
|
@ -109,7 +108,7 @@ public class MessageBuilderTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test // gh-23417
|
@Test // gh-23417
|
||||||
public void createErrorMessageFromErrorMessage() {
|
void createErrorMessageFromErrorMessage() {
|
||||||
Message<String> source = MessageBuilder.withPayload("test").setHeader("foo", "bar").build();
|
Message<String> source = MessageBuilder.withPayload("test").setHeader("foo", "bar").build();
|
||||||
RuntimeException ex = new RuntimeException();
|
RuntimeException ex = new RuntimeException();
|
||||||
ErrorMessage errorMessage1 = new ErrorMessage(ex, Collections.singletonMap("baz", "42"), source);
|
ErrorMessage errorMessage1 = new ErrorMessage(ex, Collections.singletonMap("baz", "42"), source);
|
||||||
|
@ -122,7 +121,7 @@ public class MessageBuilderTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void createIdRegenerated() {
|
void createIdRegenerated() {
|
||||||
Message<String> message1 = MessageBuilder.withPayload("test")
|
Message<String> message1 = MessageBuilder.withPayload("test")
|
||||||
.setHeader("foo", "bar").build();
|
.setHeader("foo", "bar").build();
|
||||||
Message<String> message2 = MessageBuilder.fromMessage(message1).setHeader("another", 1).build();
|
Message<String> message2 = MessageBuilder.fromMessage(message1).setHeader("another", 1).build();
|
||||||
|
@ -131,7 +130,7 @@ public class MessageBuilderTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRemove() {
|
void remove() {
|
||||||
Message<Integer> message1 = MessageBuilder.withPayload(1)
|
Message<Integer> message1 = MessageBuilder.withPayload(1)
|
||||||
.setHeader("foo", "bar").build();
|
.setHeader("foo", "bar").build();
|
||||||
Message<Integer> message2 = MessageBuilder.fromMessage(message1)
|
Message<Integer> message2 = MessageBuilder.fromMessage(message1)
|
||||||
|
@ -141,7 +140,7 @@ public class MessageBuilderTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSettingToNullRemoves() {
|
void settingToNullRemoves() {
|
||||||
Message<Integer> message1 = MessageBuilder.withPayload(1)
|
Message<Integer> message1 = MessageBuilder.withPayload(1)
|
||||||
.setHeader("foo", "bar").build();
|
.setHeader("foo", "bar").build();
|
||||||
Message<Integer> message2 = MessageBuilder.fromMessage(message1)
|
Message<Integer> message2 = MessageBuilder.fromMessage(message1)
|
||||||
|
@ -151,28 +150,28 @@ public class MessageBuilderTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNotModifiedSameMessage() throws Exception {
|
void notModifiedSameMessage() throws Exception {
|
||||||
Message<?> original = MessageBuilder.withPayload("foo").build();
|
Message<?> original = MessageBuilder.withPayload("foo").build();
|
||||||
Message<?> result = MessageBuilder.fromMessage(original).build();
|
Message<?> result = MessageBuilder.fromMessage(original).build();
|
||||||
assertThat(result).isEqualTo(original);
|
assertThat(result).isEqualTo(original);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testContainsHeaderNotModifiedSameMessage() throws Exception {
|
void containsHeaderNotModifiedSameMessage() throws Exception {
|
||||||
Message<?> original = MessageBuilder.withPayload("foo").setHeader("bar", 42).build();
|
Message<?> original = MessageBuilder.withPayload("foo").setHeader("bar", 42).build();
|
||||||
Message<?> result = MessageBuilder.fromMessage(original).build();
|
Message<?> result = MessageBuilder.fromMessage(original).build();
|
||||||
assertThat(result).isEqualTo(original);
|
assertThat(result).isEqualTo(original);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSameHeaderValueAddedNotModifiedSameMessage() throws Exception {
|
void sameHeaderValueAddedNotModifiedSameMessage() throws Exception {
|
||||||
Message<?> original = MessageBuilder.withPayload("foo").setHeader("bar", 42).build();
|
Message<?> original = MessageBuilder.withPayload("foo").setHeader("bar", 42).build();
|
||||||
Message<?> result = MessageBuilder.fromMessage(original).setHeader("bar", 42).build();
|
Message<?> result = MessageBuilder.fromMessage(original).setHeader("bar", 42).build();
|
||||||
assertThat(result).isEqualTo(original);
|
assertThat(result).isEqualTo(original);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCopySameHeaderValuesNotModifiedSameMessage() throws Exception {
|
void copySameHeaderValuesNotModifiedSameMessage() throws Exception {
|
||||||
Date current = new Date();
|
Date current = new Date();
|
||||||
Map<String, Object> originalHeaders = new HashMap<>();
|
Map<String, Object> originalHeaders = new HashMap<>();
|
||||||
originalHeaders.put("b", "xyz");
|
originalHeaders.put("b", "xyz");
|
||||||
|
@ -187,7 +186,7 @@ public class MessageBuilderTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBuildMessageWithMutableHeaders() {
|
void buildMessageWithMutableHeaders() {
|
||||||
MessageHeaderAccessor accessor = new MessageHeaderAccessor();
|
MessageHeaderAccessor accessor = new MessageHeaderAccessor();
|
||||||
accessor.setLeaveMutable(true);
|
accessor.setLeaveMutable(true);
|
||||||
MessageHeaders headers = accessor.getMessageHeaders();
|
MessageHeaders headers = accessor.getMessageHeaders();
|
||||||
|
@ -199,7 +198,7 @@ public class MessageBuilderTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBuildMessageWithDefaultMutability() {
|
void buildMessageWithDefaultMutability() {
|
||||||
MessageHeaderAccessor accessor = new MessageHeaderAccessor();
|
MessageHeaderAccessor accessor = new MessageHeaderAccessor();
|
||||||
MessageHeaders headers = accessor.getMessageHeaders();
|
MessageHeaders headers = accessor.getMessageHeaders();
|
||||||
Message<?> message = MessageBuilder.createMessage("foo", headers);
|
Message<?> message = MessageBuilder.createMessage("foo", headers);
|
||||||
|
@ -212,21 +211,16 @@ public class MessageBuilderTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBuildMessageWithoutIdAndTimestamp() {
|
void buildMessageWithoutIdAndTimestamp() {
|
||||||
MessageHeaderAccessor headerAccessor = new MessageHeaderAccessor();
|
MessageHeaderAccessor headerAccessor = new MessageHeaderAccessor();
|
||||||
headerAccessor.setIdGenerator(new IdGenerator() {
|
headerAccessor.setIdGenerator(() -> MessageHeaders.ID_VALUE_NONE);
|
||||||
@Override
|
|
||||||
public UUID generateId() {
|
|
||||||
return MessageHeaders.ID_VALUE_NONE;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Message<?> message = MessageBuilder.createMessage("foo", headerAccessor.getMessageHeaders());
|
Message<?> message = MessageBuilder.createMessage("foo", headerAccessor.getMessageHeaders());
|
||||||
assertThat(message.getHeaders().getId()).isNull();
|
assertThat(message.getHeaders().getId()).isNull();
|
||||||
assertThat(message.getHeaders().getTimestamp()).isNull();
|
assertThat(message.getHeaders().getTimestamp()).isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBuildMultipleMessages() {
|
void buildMultipleMessages() {
|
||||||
MessageHeaderAccessor headerAccessor = new MessageHeaderAccessor();
|
MessageHeaderAccessor headerAccessor = new MessageHeaderAccessor();
|
||||||
MessageBuilder<?> messageBuilder = MessageBuilder.withPayload("payload").setHeaders(headerAccessor);
|
MessageBuilder<?> messageBuilder = MessageBuilder.withPayload("payload").setHeaders(headerAccessor);
|
||||||
|
|
||||||
|
@ -243,4 +237,5 @@ public class MessageBuilderTests {
|
||||||
assertThat(message2.getHeaders().get("foo")).isEqualTo("bar2");
|
assertThat(message2.getHeaders().get("foo")).isEqualTo("bar2");
|
||||||
assertThat(message3.getHeaders().get("foo")).isEqualTo("bar3");
|
assertThat(message3.getHeaders().get("foo")).isEqualTo("bar3");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2020 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -25,6 +25,7 @@ import org.springframework.web.servlet.DispatcherServlet;
|
||||||
* @author Stephane Nicoll
|
* @author Stephane Nicoll
|
||||||
* @since 4.3.4
|
* @since 4.3.4
|
||||||
*/
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
public interface DispatcherServletCustomizer {
|
public interface DispatcherServletCustomizer {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue