Polish
This commit is contained in:
parent
5c1f700c3a
commit
891dd5a0f6
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
package org.springframework.boot.actuate.autoconfigure;
|
package org.springframework.boot.actuate.autoconfigure;
|
||||||
|
|
||||||
|
import java.lang.annotation.Documented;
|
||||||
import java.lang.annotation.ElementType;
|
import java.lang.annotation.ElementType;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
@ -33,9 +34,10 @@ import org.springframework.context.annotation.Conditional;
|
||||||
* @author Stephane Nicoll
|
* @author Stephane Nicoll
|
||||||
* @since 1.3.0
|
* @since 1.3.0
|
||||||
*/
|
*/
|
||||||
@Conditional(OnEnabledHealthIndicatorCondition.class)
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Target({ElementType.TYPE, ElementType.METHOD})
|
@Target({ ElementType.TYPE, ElementType.METHOD })
|
||||||
|
@Documented
|
||||||
|
@Conditional(OnEnabledHealthIndicatorCondition.class)
|
||||||
public @interface ConditionalOnEnablednHealthIndicator {
|
public @interface ConditionalOnEnablednHealthIndicator {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -66,4 +66,5 @@ class LinksEnhancer {
|
||||||
resource.add(linkTo(type).slash(fullPath).withRel(rel));
|
resource.add(linkTo(type).slash(fullPath).withRel(rel));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,37 +28,38 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||||
* {@link Condition} that checks if a health indicator is enabled.
|
* {@link Condition} that checks if a health indicator is enabled.
|
||||||
*
|
*
|
||||||
* @author Stephane Nicoll
|
* @author Stephane Nicoll
|
||||||
* @since 1.3.0
|
|
||||||
*/
|
*/
|
||||||
class OnEnabledHealthIndicatorCondition extends SpringBootCondition {
|
class OnEnabledHealthIndicatorCondition extends SpringBootCondition {
|
||||||
|
|
||||||
@Override
|
private static final String ANNOTATION_CLASS = ConditionalOnEnablednHealthIndicator.class
|
||||||
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
|
.getName();
|
||||||
AnnotationAttributes annotationAttributes = AnnotationAttributes.fromMap(metadata
|
|
||||||
.getAnnotationAttributes(ConditionalOnEnablednHealthIndicator.class.getName()));
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConditionOutcome getMatchOutcome(ConditionContext context,
|
||||||
|
AnnotatedTypeMetadata metadata) {
|
||||||
|
AnnotationAttributes annotationAttributes = AnnotationAttributes.fromMap(metadata
|
||||||
|
.getAnnotationAttributes(ANNOTATION_CLASS));
|
||||||
String endpointName = annotationAttributes.getString("value");
|
String endpointName = annotationAttributes.getString("value");
|
||||||
ConditionOutcome outcome = determineHealthIndicatorOutcome(endpointName, context);
|
ConditionOutcome outcome = getHealthIndicatorOutcome(context, endpointName);
|
||||||
if (outcome != null) {
|
if (outcome != null) {
|
||||||
return outcome;
|
return outcome;
|
||||||
}
|
}
|
||||||
return determineDefaultIndicatorsOutcome(context);
|
return getDefaultIndicatorsOutcome(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ConditionOutcome determineHealthIndicatorOutcome(String endpointName,
|
private ConditionOutcome getHealthIndicatorOutcome(ConditionContext context,
|
||||||
ConditionContext context) {
|
String endpointName) {
|
||||||
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
|
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
|
||||||
context.getEnvironment(), "management.health." + endpointName + ".");
|
context.getEnvironment(), "management.health." + endpointName + ".");
|
||||||
if (resolver.containsProperty("enabled")) {
|
if (resolver.containsProperty("enabled")) {
|
||||||
boolean match = resolver.getProperty("enabled", Boolean.class,
|
boolean match = resolver.getProperty("enabled", Boolean.class, true);
|
||||||
true);
|
return new ConditionOutcome(match, "The health indicator " + endpointName
|
||||||
return new ConditionOutcome(match, "The health indicator " + endpointName +
|
+ " is " + (match ? "enabled" : "disabled"));
|
||||||
" is " + (match ? "enabled" : "disabled"));
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ConditionOutcome determineDefaultIndicatorsOutcome(ConditionContext context) {
|
private ConditionOutcome getDefaultIndicatorsOutcome(ConditionContext context) {
|
||||||
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
|
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
|
||||||
context.getEnvironment(), "management.health.defaults.");
|
context.getEnvironment(), "management.health.defaults.");
|
||||||
boolean match = Boolean.valueOf(resolver.getProperty("enabled", "true"));
|
boolean match = Boolean.valueOf(resolver.getProperty("enabled", "true"));
|
||||||
|
|
|
@ -36,10 +36,6 @@ public class SimpleInMemoryRepository<T> {
|
||||||
|
|
||||||
private final ConcurrentMap<String, Object> locks = new ConcurrentReferenceHashMap<String, Object>();
|
private final ConcurrentMap<String, Object> locks = new ConcurrentReferenceHashMap<String, Object>();
|
||||||
|
|
||||||
public interface Callback<T> {
|
|
||||||
T modify(T current);
|
|
||||||
}
|
|
||||||
|
|
||||||
public T update(String name, Callback<T> callback) {
|
public T update(String name, Callback<T> callback) {
|
||||||
Object lock = this.locks.putIfAbsent(name, new Object());
|
Object lock = this.locks.putIfAbsent(name, new Object());
|
||||||
if (lock == null) {
|
if (lock == null) {
|
||||||
|
@ -101,4 +97,8 @@ public class SimpleInMemoryRepository<T> {
|
||||||
return this.values;
|
return this.values;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface Callback<T> {
|
||||||
|
T modify(T current);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
package org.springframework.boot.actuate.autoconfigure;
|
package org.springframework.boot.actuate.autoconfigure;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
|
@ -105,16 +106,15 @@ public class HealthIndicatorAutoConfigurationTests {
|
||||||
@Test
|
@Test
|
||||||
public void defaultHealthIndicatorsDisabledWithCustomOne() {
|
public void defaultHealthIndicatorsDisabledWithCustomOne() {
|
||||||
this.context.register(CustomHealthIndicator.class,
|
this.context.register(CustomHealthIndicator.class,
|
||||||
HealthIndicatorAutoConfiguration.class,
|
HealthIndicatorAutoConfiguration.class, ManagementServerProperties.class);
|
||||||
ManagementServerProperties.class);
|
|
||||||
EnvironmentTestUtils.addEnvironment(this.context,
|
EnvironmentTestUtils.addEnvironment(this.context,
|
||||||
"management.health.defaults.enabled:false");
|
"management.health.defaults.enabled:false");
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
Map<String, HealthIndicator> beans = this.context
|
Map<String, HealthIndicator> beans = this.context
|
||||||
.getBeansOfType(HealthIndicator.class);
|
.getBeansOfType(HealthIndicator.class);
|
||||||
assertEquals(1, beans.size());
|
assertEquals(1, beans.size());
|
||||||
assertSame(this.context.getBean("customHealthIndicator"), beans.values().
|
assertSame(this.context.getBean("customHealthIndicator"), beans.values()
|
||||||
iterator().next());
|
.iterator().next());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -445,6 +445,7 @@ public class HealthIndicatorAutoConfigurationTests {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,11 +135,13 @@ public class JolokiaAutoConfigurationTests {
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
protected static class EndpointsConfig extends Config {
|
protected static class EndpointsConfig extends Config {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public EndpointHandlerMapping endpointHandlerMapping(
|
public EndpointHandlerMapping endpointHandlerMapping(
|
||||||
Collection<? extends MvcEndpoint> endpoints) {
|
Collection<? extends MvcEndpoint> endpoints) {
|
||||||
return new EndpointHandlerMapping(endpoints);
|
return new EndpointHandlerMapping(endpoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
|
|
|
@ -306,7 +306,7 @@ public class RabbitProperties {
|
||||||
private Integer maxConcurrency;
|
private Integer maxConcurrency;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of messages to be handled in a single request. It should be greater than
|
* Number of messages to be handled in a single request. It should be greater than
|
||||||
* or equal to the transaction size (if used).
|
* or equal to the transaction size (if used).
|
||||||
*/
|
*/
|
||||||
private Integer prefetch;
|
private Integer prefetch;
|
||||||
|
@ -318,7 +318,7 @@ public class RabbitProperties {
|
||||||
private Integer transactionSize;
|
private Integer transactionSize;
|
||||||
|
|
||||||
public boolean isAutoStartup() {
|
public boolean isAutoStartup() {
|
||||||
return autoStartup;
|
return this.autoStartup;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAutoStartup(boolean autoStartup) {
|
public void setAutoStartup(boolean autoStartup) {
|
||||||
|
|
|
@ -86,7 +86,8 @@ enum DatabaseDriver {
|
||||||
/**
|
/**
|
||||||
* SQL Server
|
* SQL Server
|
||||||
*/
|
*/
|
||||||
SQLSERVER("com.microsoft.sqlserver.jdbc.SQLServerDriver", "com.microsoft.sqlserver.jdbc.SQLServerXADataSource");
|
SQLSERVER("com.microsoft.sqlserver.jdbc.SQLServerDriver",
|
||||||
|
"com.microsoft.sqlserver.jdbc.SQLServerXADataSource");
|
||||||
|
|
||||||
private final String driverClassName;
|
private final String driverClassName;
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ public class JmsProperties {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Listener getListener() {
|
public Listener getListener() {
|
||||||
return listener;
|
return this.listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Listener {
|
public static class Listener {
|
||||||
|
@ -69,8 +69,8 @@ public class JmsProperties {
|
||||||
private boolean autoStartup = true;
|
private boolean autoStartup = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Acknowledge mode of the container. By default, the listener is
|
* Acknowledge mode of the container. By default, the listener is transacted with
|
||||||
* transacted with automatic acknowledgment.
|
* automatic acknowledgment.
|
||||||
*/
|
*/
|
||||||
private AcknowledgeMode acknowledgeMode;
|
private AcknowledgeMode acknowledgeMode;
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ public class JmsProperties {
|
||||||
private Integer maxConcurrency;
|
private Integer maxConcurrency;
|
||||||
|
|
||||||
public boolean isAutoStartup() {
|
public boolean isAutoStartup() {
|
||||||
return autoStartup;
|
return this.autoStartup;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAutoStartup(boolean autoStartup) {
|
public void setAutoStartup(boolean autoStartup) {
|
||||||
|
@ -93,7 +93,7 @@ public class JmsProperties {
|
||||||
}
|
}
|
||||||
|
|
||||||
public AcknowledgeMode getAcknowledgeMode() {
|
public AcknowledgeMode getAcknowledgeMode() {
|
||||||
return acknowledgeMode;
|
return this.acknowledgeMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAcknowledgeMode(AcknowledgeMode acknowledgeMode) {
|
public void setAcknowledgeMode(AcknowledgeMode acknowledgeMode) {
|
||||||
|
@ -120,16 +120,17 @@ public class JmsProperties {
|
||||||
if (this.concurrency == null) {
|
if (this.concurrency == null) {
|
||||||
return (this.maxConcurrency != null ? "1-" + this.maxConcurrency : null);
|
return (this.maxConcurrency != null ? "1-" + this.maxConcurrency : null);
|
||||||
}
|
}
|
||||||
return (this.maxConcurrency != null ? this.concurrency + "-" +
|
return (this.maxConcurrency != null ? this.concurrency + "-"
|
||||||
this.maxConcurrency : String.valueOf(this.concurrency));
|
+ this.maxConcurrency : String.valueOf(this.concurrency));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Translate the acknowledge modes defined on the {@link javax.jms.Session}.
|
* Translate the acknowledge modes defined on the {@link javax.jms.Session}.
|
||||||
*
|
*
|
||||||
* <p>{@link javax.jms.Session#SESSION_TRANSACTED} is not defined as we take
|
* <p>
|
||||||
* care of this already via a call to {@code setSessionTransacted}.
|
* {@link javax.jms.Session#SESSION_TRANSACTED} is not defined as we take care of this
|
||||||
|
* already via a call to {@code setSessionTransacted}.
|
||||||
*/
|
*/
|
||||||
public enum AcknowledgeMode {
|
public enum AcknowledgeMode {
|
||||||
|
|
||||||
|
@ -140,8 +141,8 @@ public class JmsProperties {
|
||||||
AUTO(1),
|
AUTO(1),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Messages are acknowledged once the message listener implementation has
|
* Messages are acknowledged once the message listener implementation has called
|
||||||
* called {@link javax.jms.Message#acknowledge()}. This mode gives the application
|
* {@link javax.jms.Message#acknowledge()}. This mode gives the application
|
||||||
* (rather than the JMS provider) complete control over message acknowledgement.
|
* (rather than the JMS provider) complete control over message acknowledgement.
|
||||||
*/
|
*/
|
||||||
CLIENT(2),
|
CLIENT(2),
|
||||||
|
@ -160,7 +161,7 @@ public class JmsProperties {
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMode() {
|
public int getMode() {
|
||||||
return mode;
|
return this.mode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -244,7 +244,7 @@ public class ResourceServerProperties implements Validator, BeanFactoryAware {
|
||||||
}
|
}
|
||||||
if (ResourceServerProperties.this.tokenInfoUri != null
|
if (ResourceServerProperties.this.tokenInfoUri != null
|
||||||
&& ResourceServerProperties.this.tokenInfoUri
|
&& ResourceServerProperties.this.tokenInfoUri
|
||||||
.endsWith("/check_token")) {
|
.endsWith("/check_token")) {
|
||||||
return ResourceServerProperties.this.userInfoUri.replace("/check_token",
|
return ResourceServerProperties.this.userInfoUri.replace("/check_token",
|
||||||
"/token_key");
|
"/token_key");
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,9 +74,9 @@ public class ThymeleafProperties {
|
||||||
private boolean cache = true;
|
private boolean cache = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Order of the template resolver in the chain. By default, the template resolver
|
* Order of the template resolver in the chain. By default, the template resolver is
|
||||||
* is first in the chain. Order start at 1 and should only be set if you have
|
* first in the chain. Order start at 1 and should only be set if you have defined
|
||||||
* defined additional "TemplateResolver" beans.
|
* additional "TemplateResolver" beans.
|
||||||
*/
|
*/
|
||||||
private Integer templateResolverOrder;
|
private Integer templateResolverOrder;
|
||||||
|
|
||||||
|
@ -160,7 +160,7 @@ public class ThymeleafProperties {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getTemplateResolverOrder() {
|
public Integer getTemplateResolverOrder() {
|
||||||
return templateResolverOrder;
|
return this.templateResolverOrder;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTemplateResolverOrder(Integer templateResolverOrder) {
|
public void setTemplateResolverOrder(Integer templateResolverOrder) {
|
||||||
|
|
|
@ -23,7 +23,6 @@ import org.junit.After;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.rules.ExpectedException;
|
import org.junit.rules.ExpectedException;
|
||||||
|
|
||||||
import org.springframework.amqp.core.AcknowledgeMode;
|
import org.springframework.amqp.core.AcknowledgeMode;
|
||||||
import org.springframework.amqp.core.AmqpAdmin;
|
import org.springframework.amqp.core.AmqpAdmin;
|
||||||
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
|
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
|
||||||
|
@ -189,8 +188,7 @@ public class RabbitAutoConfigurationTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRabbitListenerContainerFactoryWithCustomSettings() {
|
public void testRabbitListenerContainerFactoryWithCustomSettings() {
|
||||||
load(TestConfiguration.class,
|
load(TestConfiguration.class, "spring.rabbitmq.listener.autoStartup:false",
|
||||||
"spring.rabbitmq.listener.autoStartup:false",
|
|
||||||
"spring.rabbitmq.listener.acknowledgeMode:manual",
|
"spring.rabbitmq.listener.acknowledgeMode:manual",
|
||||||
"spring.rabbitmq.listener.concurrency:5",
|
"spring.rabbitmq.listener.concurrency:5",
|
||||||
"spring.rabbitmq.listener.maxConcurrency:10",
|
"spring.rabbitmq.listener.maxConcurrency:10",
|
||||||
|
@ -201,8 +199,7 @@ public class RabbitAutoConfigurationTests {
|
||||||
SimpleRabbitListenerContainerFactory.class);
|
SimpleRabbitListenerContainerFactory.class);
|
||||||
DirectFieldAccessor dfa = new DirectFieldAccessor(rabbitListenerContainerFactory);
|
DirectFieldAccessor dfa = new DirectFieldAccessor(rabbitListenerContainerFactory);
|
||||||
assertEquals(false, dfa.getPropertyValue("autoStartup"));
|
assertEquals(false, dfa.getPropertyValue("autoStartup"));
|
||||||
assertEquals(AcknowledgeMode.MANUAL,
|
assertEquals(AcknowledgeMode.MANUAL, dfa.getPropertyValue("acknowledgeMode"));
|
||||||
dfa.getPropertyValue("acknowledgeMode"));
|
|
||||||
assertEquals(5, dfa.getPropertyValue("concurrentConsumers"));
|
assertEquals(5, dfa.getPropertyValue("concurrentConsumers"));
|
||||||
assertEquals(10, dfa.getPropertyValue("maxConcurrentConsumers"));
|
assertEquals(10, dfa.getPropertyValue("maxConcurrentConsumers"));
|
||||||
assertEquals(40, dfa.getPropertyValue("prefetchCount"));
|
assertEquals(40, dfa.getPropertyValue("prefetchCount"));
|
||||||
|
|
|
@ -76,7 +76,7 @@ import static org.mockito.Mockito.mock;
|
||||||
*/
|
*/
|
||||||
public class JacksonAutoConfigurationTests {
|
public class JacksonAutoConfigurationTests {
|
||||||
|
|
||||||
AnnotationConfigApplicationContext context;
|
private AnnotationConfigApplicationContext context;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
|
@ -411,8 +411,8 @@ public class JacksonAutoConfigurationTests {
|
||||||
EnvironmentTestUtils.addEnvironment(this.context,
|
EnvironmentTestUtils.addEnvironment(this.context,
|
||||||
"spring.jackson.date-format:zzzz");
|
"spring.jackson.date-format:zzzz");
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
ObjectMapper objectMapper = this.context
|
ObjectMapper objectMapper = this.context.getBean(
|
||||||
.getBean(Jackson2ObjectMapperBuilder.class).build();
|
Jackson2ObjectMapperBuilder.class).build();
|
||||||
|
|
||||||
DateTime dateTime = new DateTime(1436966242231L, DateTimeZone.UTC);
|
DateTime dateTime = new DateTime(1436966242231L, DateTimeZone.UTC);
|
||||||
assertEquals("\"Koordinierte Universalzeit\"",
|
assertEquals("\"Koordinierte Universalzeit\"",
|
||||||
|
|
|
@ -146,8 +146,7 @@ public class JmsAutoConfigurationTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJmsListenerContainerFactoryWithCustomSettings() {
|
public void testJmsListenerContainerFactoryWithCustomSettings() {
|
||||||
load(EnableJmsConfiguration.class,
|
load(EnableJmsConfiguration.class, "spring.jms.listener.autoStartup=false",
|
||||||
"spring.jms.listener.autoStartup=false",
|
|
||||||
"spring.jms.listener.acknowledgeMode=client",
|
"spring.jms.listener.acknowledgeMode=client",
|
||||||
"spring.jms.listener.concurrency=2",
|
"spring.jms.listener.concurrency=2",
|
||||||
"spring.jms.listener.maxConcurrency=10");
|
"spring.jms.listener.maxConcurrency=10");
|
||||||
|
@ -155,10 +154,11 @@ public class JmsAutoConfigurationTests {
|
||||||
.getBean("jmsListenerContainerFactory", JmsListenerContainerFactory.class);
|
.getBean("jmsListenerContainerFactory", JmsListenerContainerFactory.class);
|
||||||
assertEquals(DefaultJmsListenerContainerFactory.class,
|
assertEquals(DefaultJmsListenerContainerFactory.class,
|
||||||
jmsListenerContainerFactory.getClass());
|
jmsListenerContainerFactory.getClass());
|
||||||
DefaultMessageListenerContainer listenerContainer = ((DefaultJmsListenerContainerFactory)
|
DefaultMessageListenerContainer listenerContainer = ((DefaultJmsListenerContainerFactory) jmsListenerContainerFactory)
|
||||||
jmsListenerContainerFactory).createListenerContainer(mock(JmsListenerEndpoint.class));
|
.createListenerContainer(mock(JmsListenerEndpoint.class));
|
||||||
assertEquals(false, listenerContainer.isAutoStartup());
|
assertEquals(false, listenerContainer.isAutoStartup());
|
||||||
assertEquals(Session.CLIENT_ACKNOWLEDGE, listenerContainer.getSessionAcknowledgeMode());
|
assertEquals(Session.CLIENT_ACKNOWLEDGE,
|
||||||
|
listenerContainer.getSessionAcknowledgeMode());
|
||||||
assertEquals(2, listenerContainer.getConcurrentConsumers());
|
assertEquals(2, listenerContainer.getConcurrentConsumers());
|
||||||
assertEquals(10, listenerContainer.getMaxConcurrentConsumers());
|
assertEquals(10, listenerContainer.getMaxConcurrentConsumers());
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,9 +16,6 @@
|
||||||
|
|
||||||
package org.springframework.boot.autoconfigure.security.oauth2;
|
package org.springframework.boot.autoconfigure.security.oauth2;
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.equalTo;
|
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -94,6 +91,9 @@ import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.JsonNode;
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.equalTo;
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify Spring Security OAuth2 auto-configuration secures end points properly, accepts
|
* Verify Spring Security OAuth2 auto-configuration secures end points properly, accepts
|
||||||
* environmental overrides, and also backs off in the presence of other
|
* environmental overrides, and also backs off in the presence of other
|
||||||
|
@ -358,9 +358,9 @@ public class OAuth2AutoConfigurationTests {
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@Import({ UseFreePortEmbeddedContainerConfiguration.class,
|
@Import({ UseFreePortEmbeddedContainerConfiguration.class,
|
||||||
SecurityAutoConfiguration.class, ServerPropertiesAutoConfiguration.class,
|
SecurityAutoConfiguration.class, ServerPropertiesAutoConfiguration.class,
|
||||||
DispatcherServletAutoConfiguration.class, OAuth2AutoConfiguration.class,
|
DispatcherServletAutoConfiguration.class, OAuth2AutoConfiguration.class,
|
||||||
WebMvcAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class })
|
WebMvcAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class })
|
||||||
protected static class MinimalSecureWebApplication {
|
protected static class MinimalSecureWebApplication {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -396,7 +396,7 @@ public class OAuth2AutoConfigurationTests {
|
||||||
@EnableResourceServer
|
@EnableResourceServer
|
||||||
@EnableGlobalMethodSecurity(prePostEnabled = true)
|
@EnableGlobalMethodSecurity(prePostEnabled = true)
|
||||||
protected static class AuthorizationAndResourceServerConfiguration extends
|
protected static class AuthorizationAndResourceServerConfiguration extends
|
||||||
TestSecurityConfiguration {
|
TestSecurityConfiguration {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -419,7 +419,7 @@ public class OAuth2AutoConfigurationTests {
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableAuthorizationServer
|
@EnableAuthorizationServer
|
||||||
protected static class AuthorizationServerConfiguration extends
|
protected static class AuthorizationServerConfiguration extends
|
||||||
TestSecurityConfiguration {
|
TestSecurityConfiguration {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,7 +474,7 @@ public class OAuth2AutoConfigurationTests {
|
||||||
@Override
|
@Override
|
||||||
public void configure(HttpSecurity http) throws Exception {
|
public void configure(HttpSecurity http) throws Exception {
|
||||||
http.authorizeRequests().anyRequest().authenticated().and().httpBasic().and()
|
http.authorizeRequests().anyRequest().authenticated().and().httpBasic().and()
|
||||||
.csrf().disable();
|
.csrf().disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -482,7 +482,7 @@ public class OAuth2AutoConfigurationTests {
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableAuthorizationServer
|
@EnableAuthorizationServer
|
||||||
protected static class CustomAuthorizationServer extends
|
protected static class CustomAuthorizationServer extends
|
||||||
AuthorizationServerConfigurerAdapter {
|
AuthorizationServerConfigurerAdapter {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private AuthenticationManager authenticationManager;
|
private AuthenticationManager authenticationManager;
|
||||||
|
@ -502,9 +502,9 @@ public class OAuth2AutoConfigurationTests {
|
||||||
@Override
|
@Override
|
||||||
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
|
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
|
||||||
clients.inMemory().withClient("client").secret("secret")
|
clients.inMemory().withClient("client").secret("secret")
|
||||||
.resourceIds("resource-id").authorizedGrantTypes("password")
|
.resourceIds("resource-id").authorizedGrantTypes("password")
|
||||||
.authorities("USER").scopes("read")
|
.authorities("USER").scopes("read")
|
||||||
.redirectUris("http://localhost:8080");
|
.redirectUris("http://localhost:8080");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -181,6 +181,7 @@ public class BasicErrorControllerIntegrationTests {
|
||||||
public NoReasonExpectedException(String message) {
|
public NoReasonExpectedException(String message) {
|
||||||
super(message);
|
super(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1476,7 +1476,6 @@ respectively.
|
||||||
|
|
||||||
[[howto-use-exposing-spring-data-repositories-rest-endpoint]]
|
[[howto-use-exposing-spring-data-repositories-rest-endpoint]]
|
||||||
=== Expose Spring Data repositories as REST endpoint
|
=== Expose Spring Data repositories as REST endpoint
|
||||||
|
|
||||||
Spring Data REST can expose the `Repository` implementations as REST endpoints for you as
|
Spring Data REST can expose the `Repository` implementations as REST endpoints for you as
|
||||||
long as Spring MVC has been enabled for the application.
|
long as Spring MVC has been enabled for the application.
|
||||||
|
|
||||||
|
|
|
@ -781,7 +781,6 @@ annotations to your `@ConfigurationProperties` class:
|
||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
||||||
In order to validate values of nested properties, you must annotate the associated field
|
In order to validate values of nested properties, you must annotate the associated field
|
||||||
as `@Valid` to trigger its validation. For example, building upon the above
|
as `@Valid` to trigger its validation. For example, building upon the above
|
||||||
`ConnectionSettings` example:
|
`ConnectionSettings` example:
|
||||||
|
|
|
@ -23,13 +23,11 @@
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter</artifactId>
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-configuration-processor</artifactId>
|
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
|
|
@ -34,7 +34,7 @@ public class SampleProperties {
|
||||||
private Integer port = 8080;
|
private Integer port = 8080;
|
||||||
|
|
||||||
public String getHost() {
|
public String getHost() {
|
||||||
return host;
|
return this.host;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setHost(String host) {
|
public void setHost(String host) {
|
||||||
|
@ -42,10 +42,11 @@ public class SampleProperties {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getPort() {
|
public Integer getPort() {
|
||||||
return port;
|
return this.port;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPort(Integer port) {
|
public void setPort(Integer port) {
|
||||||
this.port = port;
|
this.port = port;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,10 +35,9 @@ public class SamplePropertiesValidator implements Validator {
|
||||||
public void validate(Object o, Errors errors) {
|
public void validate(Object o, Errors errors) {
|
||||||
ValidationUtils.rejectIfEmpty(errors, "host", "host.empty");
|
ValidationUtils.rejectIfEmpty(errors, "host", "host.empty");
|
||||||
ValidationUtils.rejectIfEmpty(errors, "port", "port.empty");
|
ValidationUtils.rejectIfEmpty(errors, "port", "port.empty");
|
||||||
|
|
||||||
SampleProperties properties = (SampleProperties) o;
|
SampleProperties properties = (SampleProperties) o;
|
||||||
if (properties.getHost() != null &&
|
if (properties.getHost() != null
|
||||||
!pattern.matcher(properties.getHost()).matches()) {
|
&& !this.pattern.matcher(properties.getHost()).matches()) {
|
||||||
errors.rejectValue("host", "Invalid host");
|
errors.rejectValue("host", "Invalid host");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,8 +52,8 @@ public class SamplePropertyValidationApplication {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
new SpringApplicationBuilder(SamplePropertyValidationApplication.class)
|
new SpringApplicationBuilder(SamplePropertyValidationApplication.class).profiles(
|
||||||
.profiles("app").run(args);
|
"app").run(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@ import org.junit.After;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.rules.ExpectedException;
|
import org.junit.rules.ExpectedException;
|
||||||
|
|
||||||
import org.springframework.beans.factory.BeanCreationException;
|
import org.springframework.beans.factory.BeanCreationException;
|
||||||
import org.springframework.boot.autoconfigure.web.ServerProperties;
|
import org.springframework.boot.autoconfigure.web.ServerProperties;
|
||||||
import org.springframework.boot.test.EnvironmentTestUtils;
|
import org.springframework.boot.test.EnvironmentTestUtils;
|
||||||
|
@ -43,16 +42,15 @@ public class SamplePropertyValidationApplicationTests {
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void closeContext() {
|
public void closeContext() {
|
||||||
context.close();
|
this.context.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void bindValidProperties() {
|
public void bindValidProperties() {
|
||||||
this.context.register(SamplePropertyValidationApplication.class);
|
this.context.register(SamplePropertyValidationApplication.class);
|
||||||
EnvironmentTestUtils.addEnvironment(this.context,
|
EnvironmentTestUtils.addEnvironment(this.context, "sample.host:192.168.0.1",
|
||||||
"sample.host:192.168.0.1", "sample.port:9090");
|
"sample.port:9090");
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
|
|
||||||
SampleProperties properties = this.context.getBean(SampleProperties.class);
|
SampleProperties properties = this.context.getBean(SampleProperties.class);
|
||||||
assertEquals("192.168.0.1", properties.getHost());
|
assertEquals("192.168.0.1", properties.getHost());
|
||||||
assertEquals(Integer.valueOf(9090), properties.getPort());
|
assertEquals(Integer.valueOf(9090), properties.getPort());
|
||||||
|
@ -61,32 +59,29 @@ public class SamplePropertyValidationApplicationTests {
|
||||||
@Test
|
@Test
|
||||||
public void bindInvalidHost() {
|
public void bindInvalidHost() {
|
||||||
this.context.register(SamplePropertyValidationApplication.class);
|
this.context.register(SamplePropertyValidationApplication.class);
|
||||||
EnvironmentTestUtils.addEnvironment(this.context,
|
EnvironmentTestUtils.addEnvironment(this.context, "sample.host:xxxxxx",
|
||||||
"sample.host:xxxxxx", "sample.port:9090");
|
"sample.port:9090");
|
||||||
|
this.thrown.expect(BeanCreationException.class);
|
||||||
thrown.expect(BeanCreationException.class);
|
this.thrown.expectMessage("xxxxxx");
|
||||||
thrown.expectMessage("xxxxxx");
|
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void bindNullHost() {
|
public void bindNullHost() {
|
||||||
this.context.register(SamplePropertyValidationApplication.class);
|
this.context.register(SamplePropertyValidationApplication.class);
|
||||||
|
this.thrown.expect(BeanCreationException.class);
|
||||||
thrown.expect(BeanCreationException.class);
|
this.thrown.expectMessage("null");
|
||||||
thrown.expectMessage("null");
|
this.thrown.expectMessage("host");
|
||||||
thrown.expectMessage("host");
|
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void validatorOnlyCalledOnSupportedClass() {
|
public void validatorOnlyCalledOnSupportedClass() {
|
||||||
this.context.register(SamplePropertyValidationApplication.class);
|
this.context.register(SamplePropertyValidationApplication.class);
|
||||||
this.context.register(ServerProperties.class); // our validator will not apply here
|
this.context.register(ServerProperties.class); // our validator will not apply
|
||||||
EnvironmentTestUtils.addEnvironment(this.context,
|
EnvironmentTestUtils.addEnvironment(this.context, "sample.host:192.168.0.1",
|
||||||
"sample.host:192.168.0.1", "sample.port:9090");
|
"sample.port:9090");
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
|
|
||||||
SampleProperties properties = this.context.getBean(SampleProperties.class);
|
SampleProperties properties = this.context.getBean(SampleProperties.class);
|
||||||
assertEquals("192.168.0.1", properties.getHost());
|
assertEquals("192.168.0.1", properties.getHost());
|
||||||
assertEquals(Integer.valueOf(9090), properties.getPort());
|
assertEquals(Integer.valueOf(9090), properties.getPort());
|
||||||
|
|
|
@ -101,33 +101,8 @@ public class LaunchedURLClassLoader extends URLClassLoader {
|
||||||
if (this.rootClassLoader == null) {
|
if (this.rootClassLoader == null) {
|
||||||
return findResources(name);
|
return findResources(name);
|
||||||
}
|
}
|
||||||
|
return new ResourceEnumeration(this.rootClassLoader.getResources(name),
|
||||||
final Enumeration<URL> rootResources = this.rootClassLoader.getResources(name);
|
findResources(name));
|
||||||
final Enumeration<URL> localResources = findResources(name);
|
|
||||||
|
|
||||||
return new Enumeration<URL>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasMoreElements() {
|
|
||||||
try {
|
|
||||||
Handler.setUseFastConnectionExceptions(true);
|
|
||||||
return rootResources.hasMoreElements()
|
|
||||||
|| localResources.hasMoreElements();
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
Handler.setUseFastConnectionExceptions(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public URL nextElement() {
|
|
||||||
if (rootResources.hasMoreElements()) {
|
|
||||||
return rootResources.nextElement();
|
|
||||||
}
|
|
||||||
return localResources.nextElement();
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -267,4 +242,41 @@ public class LaunchedURLClassLoader extends URLClassLoader {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link Enumeration} implementation used for {@code getResources()}.
|
||||||
|
*/
|
||||||
|
private static class ResourceEnumeration implements Enumeration<URL> {
|
||||||
|
|
||||||
|
private final Enumeration<URL> rootResources;
|
||||||
|
|
||||||
|
private final Enumeration<URL> localResources;
|
||||||
|
|
||||||
|
public ResourceEnumeration(Enumeration<URL> rootResources,
|
||||||
|
Enumeration<URL> localResources) {
|
||||||
|
this.rootResources = rootResources;
|
||||||
|
this.localResources = localResources;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasMoreElements() {
|
||||||
|
try {
|
||||||
|
Handler.setUseFastConnectionExceptions(true);
|
||||||
|
return this.rootResources.hasMoreElements()
|
||||||
|
|| this.localResources.hasMoreElements();
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
Handler.setUseFastConnectionExceptions(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public URL nextElement() {
|
||||||
|
if (this.rootResources.hasMoreElements()) {
|
||||||
|
return this.rootResources.nextElement();
|
||||||
|
}
|
||||||
|
return this.localResources.nextElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -355,11 +355,11 @@ public class RelaxedDataBinderTests {
|
||||||
bind(target, "nested.foo: bar.key\n" + "nested[bar.key].spam: bucket\n"
|
bind(target, "nested.foo: bar.key\n" + "nested[bar.key].spam: bucket\n"
|
||||||
+ "nested[bar.key].value: 123\nnested[bar.key].foo: crap");
|
+ "nested[bar.key].value: 123\nnested[bar.key].foo: crap");
|
||||||
assertEquals(2, target.getNested().size());
|
assertEquals(2, target.getNested().size());
|
||||||
Map<String, Object> nestedMap = (Map<String, Object>) target.getNested().get("bar.key");
|
Map<String, Object> nestedMap = (Map<String, Object>) target.getNested().get(
|
||||||
|
"bar.key");
|
||||||
assertNotNull("nested map should be registered with 'bar.key'", nestedMap);
|
assertNotNull("nested map should be registered with 'bar.key'", nestedMap);
|
||||||
assertEquals(3, nestedMap.size());
|
assertEquals(3, nestedMap.size());
|
||||||
assertEquals("123",
|
assertEquals("123", nestedMap.get("value"));
|
||||||
nestedMap.get("value"));
|
|
||||||
assertEquals("bar.key", target.getNested().get("foo"));
|
assertEquals("bar.key", target.getNested().get("foo"));
|
||||||
assertFalse(target.getNested().containsValue(target.getNested()));
|
assertFalse(target.getNested().containsValue(target.getNested()));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue