Polish Actuator hypermedia support
This commit is contained in:
@@ -88,9 +88,9 @@ import org.springframework.web.servlet.DispatcherServlet;
|
||||
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class })
|
||||
@ConditionalOnWebApplication
|
||||
@AutoConfigureAfter({ PropertyPlaceholderAutoConfiguration.class,
|
||||
EmbeddedServletContainerAutoConfiguration.class, WebMvcAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
HypermediaAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class })
|
||||
EmbeddedServletContainerAutoConfiguration.class, WebMvcAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
HypermediaAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class })
|
||||
public class EndpointWebMvcAutoConfiguration implements ApplicationContextAware,
|
||||
SmartInitializingSingleton {
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
* Copyright 2012-2015 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.
|
||||
@@ -16,21 +16,17 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.ActuatorDocsEndpoint;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.HalBrowserEndpoint;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.HypermediaDisabled;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.LinksEnhancer;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.LinksMvcEndpoint;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoints;
|
||||
@@ -78,11 +74,13 @@ import com.fasterxml.jackson.annotation.JsonUnwrapped;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
|
||||
|
||||
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||
|
||||
/**
|
||||
* Autoconfiguration for hypermedia in HTTP endpoints.
|
||||
* Configuration for hypermedia in HTTP endpoints.
|
||||
*
|
||||
* @author Dave Syer
|
||||
*
|
||||
* @since 1.3.0
|
||||
*/
|
||||
@Configuration
|
||||
@ConditionalOnClass(Link.class)
|
||||
@@ -124,10 +122,14 @@ public class EndpointWebMvcHypermediaConfiguration {
|
||||
return new DefaultCurieProvider("boot", new UriTemplate(path));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link SpringBootCondition} to detect the Spring Data REST HAL browser.
|
||||
*/
|
||||
@Configuration("EndpointHypermediaAutoConfiguration.MissingResourceCondition")
|
||||
@ConditionalOnResource(resources = "classpath:/META-INF/spring-data-rest/hal-browser/index.html")
|
||||
protected static class MissingSpringDataRestResourceCondition extends
|
||||
SpringBootCondition {
|
||||
SpringBootCondition {
|
||||
|
||||
@Override
|
||||
public ConditionOutcome getMatchOutcome(ConditionContext context,
|
||||
AnnotatedTypeMetadata metadata) {
|
||||
@@ -136,44 +138,46 @@ public class EndpointWebMvcHypermediaConfiguration {
|
||||
return ConditionOutcome.noMatch("Spring Data REST HAL browser found");
|
||||
}
|
||||
return ConditionOutcome.match("Spring Data REST HAL browser not found");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Configuration for Endpoint links.
|
||||
*/
|
||||
@ConditionalOnProperty(value = "endpoints.links.enabled", matchIfMissing = true)
|
||||
public static class LinksConfiguration {
|
||||
|
||||
@Bean
|
||||
public LinksMvcEndpoint linksMvcEndpoint(ResourceProperties resources) {
|
||||
return new LinksMvcEndpoint(resources.getWelcomePage() != null ? "/links"
|
||||
: "");
|
||||
String defaultPath = (resources.getWelcomePage() != null ? "/links" : "");
|
||||
return new LinksMvcEndpoint(defaultPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Controller advice that adds links to the home page and/or the management
|
||||
* context path. The home page is enhanced if it is composed already of a
|
||||
* {@link ResourceSupport} (e.g. when using Spring Data REST).
|
||||
*
|
||||
* @author Dave Syer
|
||||
*
|
||||
*/
|
||||
@ControllerAdvice
|
||||
public static class HomePageLinksAdvice implements ResponseBodyAdvice<Object> {
|
||||
|
||||
@Autowired
|
||||
MvcEndpoints endpoints;
|
||||
private MvcEndpoints endpoints;
|
||||
|
||||
@Autowired
|
||||
LinksMvcEndpoint linksEndpoint;
|
||||
private LinksMvcEndpoint linksEndpoint;
|
||||
|
||||
@Autowired
|
||||
ManagementServerProperties management;
|
||||
private ManagementServerProperties management;
|
||||
|
||||
private LinksEnhancer linksEnhancer;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
this.linksEnhancer = new LinksEnhancer(this.endpoints,
|
||||
this.management.getContextPath());
|
||||
this.linksEnhancer = new LinksEnhancer(this.management.getContextPath(),
|
||||
this.endpoints);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -196,33 +200,31 @@ public class EndpointWebMvcHypermediaConfiguration {
|
||||
public Object beforeBodyWrite(Object body, MethodParameter returnType,
|
||||
MediaType selectedContentType,
|
||||
Class<? extends HttpMessageConverter<?>> selectedConverterType,
|
||||
ServerHttpRequest request, ServerHttpResponse response) {
|
||||
HttpServletRequest servletRequest = null;
|
||||
ServerHttpRequest request, ServerHttpResponse response) {
|
||||
if (request instanceof ServletServerHttpRequest) {
|
||||
servletRequest = ((ServletServerHttpRequest) request)
|
||||
.getServletRequest();
|
||||
Object pattern = servletRequest
|
||||
.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
|
||||
if (pattern != null) {
|
||||
String path = pattern.toString();
|
||||
if (isHomePage(path) || isManagementPath(path)
|
||||
|| isLinksPath(path)) {
|
||||
ResourceSupport resource = (ResourceSupport) body;
|
||||
if (isHomePage(path) && hasManagementPath()) {
|
||||
String rel = this.management.getContextPath()
|
||||
.substring(1);
|
||||
resource.add(linkTo(
|
||||
EndpointWebMvcHypermediaConfiguration.class)
|
||||
.slash(this.management.getContextPath()).withRel(
|
||||
rel));
|
||||
}
|
||||
else {
|
||||
this.linksEnhancer.addEndpointLinks(resource, "");
|
||||
}
|
||||
beforeBodyWrite(body, (ServletServerHttpRequest) request);
|
||||
}
|
||||
return body;
|
||||
}
|
||||
|
||||
private void beforeBodyWrite(Object body, ServletServerHttpRequest request) {
|
||||
Object pattern = request.getServletRequest().getAttribute(
|
||||
HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
|
||||
if (pattern != null) {
|
||||
String path = pattern.toString();
|
||||
if (isHomePage(path) || isManagementPath(path) || isLinksPath(path)) {
|
||||
ResourceSupport resource = (ResourceSupport) body;
|
||||
if (isHomePage(path) && hasManagementPath()) {
|
||||
String rel = this.management.getContextPath().substring(1);
|
||||
resource.add(linkTo(
|
||||
EndpointWebMvcHypermediaConfiguration.class).slash(
|
||||
this.management.getContextPath()).withRel(rel));
|
||||
}
|
||||
else {
|
||||
this.linksEnhancer.addEndpointLinks(resource, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
return body;
|
||||
}
|
||||
|
||||
private boolean hasManagementPath() {
|
||||
@@ -245,29 +247,26 @@ public class EndpointWebMvcHypermediaConfiguration {
|
||||
}
|
||||
|
||||
/**
|
||||
* Controller advice that adds links to the existing Actuator endpoints. By default
|
||||
* all the top-level resources are enhanced with a "self" link. Those resources that
|
||||
* could not be enhanced (e.g. "/env/{name}") because their values are "primitive" are
|
||||
* ignored. Those that have values of type Collection (e.g. /trace) are transformed in
|
||||
* to maps, and the original collection value is added with a key equal to the
|
||||
* endpoint name.
|
||||
*
|
||||
* @author Dave Syer
|
||||
*
|
||||
* Controller advice that adds links to the existing Actuator endpoints. By
|
||||
* default all the top-level resources are enhanced with a "self" link. Those
|
||||
* resources that could not be enhanced (e.g. "/env/{name}") because their values
|
||||
* are "primitive" are ignored. Those that have values of type Collection (e.g.
|
||||
* /trace) are transformed in to maps, and the original collection value is added
|
||||
* with a key equal to the endpoint name.
|
||||
*/
|
||||
@ControllerAdvice(assignableTypes = MvcEndpoint.class)
|
||||
public static class MvcEndpointAdvice implements ResponseBodyAdvice<Object> {
|
||||
|
||||
@Autowired
|
||||
ManagementServerProperties management;
|
||||
private ManagementServerProperties management;
|
||||
|
||||
@Autowired
|
||||
HttpMessageConverters converters;
|
||||
private HttpMessageConverters converters;
|
||||
|
||||
private Map<MediaType, HttpMessageConverter<?>> converterCache = new ConcurrentHashMap<MediaType, HttpMessageConverter<?>>();
|
||||
|
||||
@Autowired
|
||||
ObjectMapper mapper;
|
||||
private ObjectMapper mapper;
|
||||
|
||||
@Override
|
||||
public boolean supports(MethodParameter returnType,
|
||||
@@ -281,71 +280,71 @@ public class EndpointWebMvcHypermediaConfiguration {
|
||||
public Object beforeBodyWrite(Object body, MethodParameter returnType,
|
||||
MediaType selectedContentType,
|
||||
Class<? extends HttpMessageConverter<?>> selectedConverterType,
|
||||
ServerHttpRequest request, ServerHttpResponse response) {
|
||||
ServerHttpRequest request, ServerHttpResponse response) {
|
||||
if (request instanceof ServletServerHttpRequest) {
|
||||
return beforeBodyWrite(body, returnType, selectedContentType,
|
||||
selectedConverterType, (ServletServerHttpRequest) request,
|
||||
response);
|
||||
}
|
||||
return body;
|
||||
}
|
||||
|
||||
if (body == null) {
|
||||
// Assume it already was handled
|
||||
private Object beforeBodyWrite(Object body, MethodParameter returnType,
|
||||
MediaType selectedContentType,
|
||||
Class<? extends HttpMessageConverter<?>> selectedConverterType,
|
||||
ServletServerHttpRequest request, ServerHttpResponse response) {
|
||||
if (body == null || body instanceof Resource) {
|
||||
// Assume it already was handled or it already has its links
|
||||
return body;
|
||||
}
|
||||
|
||||
if (body instanceof Resource) {
|
||||
// Assume it already has its links
|
||||
return body;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
HttpMessageConverter<Object> converter = (HttpMessageConverter<Object>) findConverter(
|
||||
HttpMessageConverter<Object> converter = findConverter(
|
||||
selectedConverterType, selectedContentType);
|
||||
if (converter == null) {
|
||||
if (converter == null || isHypermediaDisabled(returnType)) {
|
||||
// Not a resource that can be enhanced with a link
|
||||
return body;
|
||||
}
|
||||
if (AnnotationUtils.findAnnotation(returnType.getMethod(),
|
||||
HypermediaDisabled.class) != null
|
||||
|| AnnotationUtils.findAnnotation(returnType.getMethod()
|
||||
.getDeclaringClass(), HypermediaDisabled.class) != null) {
|
||||
return body;
|
||||
String path = getPath(request);
|
||||
try {
|
||||
converter.write(new EndpointResource(body, path),
|
||||
selectedContentType, response);
|
||||
}
|
||||
|
||||
HttpServletRequest servletRequest = null;
|
||||
if (request instanceof ServletServerHttpRequest) {
|
||||
servletRequest = ((ServletServerHttpRequest) request).getServletRequest();
|
||||
String path = (String) servletRequest
|
||||
.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
|
||||
if (path == null) {
|
||||
path = "";
|
||||
}
|
||||
try {
|
||||
converter.write(new EndpointResource(body, path),
|
||||
selectedContentType, response);
|
||||
}
|
||||
catch (IOException e) {
|
||||
throw new HttpMessageNotWritableException("Cannot write response", e);
|
||||
}
|
||||
return null;
|
||||
catch (IOException ex) {
|
||||
throw new HttpMessageNotWritableException("Cannot write response", ex);
|
||||
}
|
||||
else {
|
||||
return body;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private HttpMessageConverter<?> findConverter(
|
||||
@SuppressWarnings("unchecked")
|
||||
private HttpMessageConverter<Object> findConverter(
|
||||
Class<? extends HttpMessageConverter<?>> selectedConverterType,
|
||||
MediaType mediaType) {
|
||||
MediaType mediaType) {
|
||||
if (this.converterCache.containsKey(mediaType)) {
|
||||
return this.converterCache.get(mediaType);
|
||||
return (HttpMessageConverter<Object>) this.converterCache
|
||||
.get(mediaType);
|
||||
}
|
||||
for (HttpMessageConverter<?> converter : this.converters) {
|
||||
if (selectedConverterType.isAssignableFrom(converter.getClass())
|
||||
&& converter.canWrite(EndpointResource.class, mediaType)) {
|
||||
this.converterCache.put(mediaType, converter);
|
||||
return converter;
|
||||
return (HttpMessageConverter<Object>) converter;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean isHypermediaDisabled(MethodParameter returnType) {
|
||||
return AnnotationUtils.findAnnotation(returnType.getMethod(),
|
||||
HypermediaDisabled.class) != null
|
||||
|| AnnotationUtils.findAnnotation(returnType.getMethod()
|
||||
.getDeclaringClass(), HypermediaDisabled.class) != null;
|
||||
}
|
||||
|
||||
private String getPath(ServletServerHttpRequest request) {
|
||||
String path = (String) request.getServletRequest().getAttribute(
|
||||
HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
|
||||
return (path == null ? "" : path);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoints;
|
||||
import org.springframework.hateoas.ResourceSupport;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||
|
||||
/**
|
||||
* Adds enpoints links to {@link ResourceSupport}.
|
||||
*
|
||||
* @author Dave Syer
|
||||
*/
|
||||
class LinksEnhancer {
|
||||
|
||||
private final String rootPath;
|
||||
|
||||
private final MvcEndpoints endpoints;
|
||||
|
||||
public LinksEnhancer(String rootPath, MvcEndpoints endpoints) {
|
||||
this.rootPath = rootPath;
|
||||
this.endpoints = endpoints;
|
||||
}
|
||||
|
||||
public void addEndpointLinks(ResourceSupport resource, String self) {
|
||||
if (!resource.hasLink("self")) {
|
||||
resource.add(linkTo(LinksEnhancer.class).slash(this.rootPath + self)
|
||||
.withSelfRel());
|
||||
}
|
||||
for (MvcEndpoint endpoint : this.endpoints.getEndpoints()) {
|
||||
if (!endpoint.getPath().equals(self)) {
|
||||
addEndpointLink(resource, endpoint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addEndpointLink(ResourceSupport resource, MvcEndpoint endpoint) {
|
||||
Class<?> type = endpoint.getEndpointType();
|
||||
type = (type == null ? Object.class : type);
|
||||
String path = endpoint.getPath();
|
||||
String rel = (path.startsWith("/") ? path.substring(1) : path);
|
||||
if (StringUtils.hasText(rel)) {
|
||||
String fullPath = this.rootPath + endpoint.getPath();
|
||||
resource.add(linkTo(type).slash(fullPath).withRel(rel));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,7 +103,7 @@ public class ManagementSecurityAutoConfiguration {
|
||||
|
||||
@Configuration
|
||||
protected static class ManagementSecurityPropertiesConfiguration implements
|
||||
SecurityPrerequisite {
|
||||
SecurityPrerequisite {
|
||||
|
||||
@Autowired(required = false)
|
||||
private SecurityProperties security;
|
||||
@@ -115,7 +115,7 @@ public class ManagementSecurityAutoConfiguration {
|
||||
public void init() {
|
||||
if (this.management != null && this.security != null) {
|
||||
this.security.getUser().getRole()
|
||||
.add(this.management.getSecurity().getRole());
|
||||
.add(this.management.getSecurity().getRole());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ public class ManagementSecurityAutoConfiguration {
|
||||
// Get the ignored paths in early
|
||||
@Order(SecurityProperties.IGNORED_ORDER + 1)
|
||||
private static class IgnoredPathsWebSecurityConfigurerAdapter implements
|
||||
WebSecurityConfigurer<WebSecurity> {
|
||||
WebSecurityConfigurer<WebSecurity> {
|
||||
|
||||
@Autowired(required = false)
|
||||
private ErrorController errorController;
|
||||
@@ -209,7 +209,7 @@ public class ManagementSecurityAutoConfiguration {
|
||||
@ConditionalOnProperty(prefix = "management.security", name = "enabled", matchIfMissing = true)
|
||||
@Order(ManagementServerProperties.BASIC_AUTH_ORDER)
|
||||
protected static class ManagementWebSecurityConfigurerAdapter extends
|
||||
WebSecurityConfigurerAdapter {
|
||||
WebSecurityConfigurerAdapter {
|
||||
|
||||
@Autowired
|
||||
private SecurityProperties security;
|
||||
@@ -314,17 +314,15 @@ public class ManagementSecurityAutoConfiguration {
|
||||
}
|
||||
if (this.delegate == null) {
|
||||
List<RequestMatcher> pathMatchers = new ArrayList<RequestMatcher>();
|
||||
String[] paths = !this.sensitive ? getEndpointPaths(
|
||||
endpointMapping,
|
||||
false)
|
||||
: getEndpointPaths(endpointMapping);
|
||||
for (String path : paths) {
|
||||
pathMatchers.add(new AntPathRequestMatcher(
|
||||
ManagementWebSecurityConfigurerAdapter.this.server
|
||||
String[] paths = !this.sensitive ? getEndpointPaths(endpointMapping,
|
||||
false) : getEndpointPaths(endpointMapping);
|
||||
for (String path : paths) {
|
||||
pathMatchers.add(new AntPathRequestMatcher(
|
||||
ManagementWebSecurityConfigurerAdapter.this.server
|
||||
.getPath(path)));
|
||||
}
|
||||
this.delegate = pathMatchers.isEmpty() ? AnyRequestMatcher.INSTANCE
|
||||
: new OrRequestMatcher(pathMatchers);
|
||||
}
|
||||
this.delegate = pathMatchers.isEmpty() ? AnyRequestMatcher.INSTANCE
|
||||
: new OrRequestMatcher(pathMatchers);
|
||||
}
|
||||
return this.delegate.matches(request);
|
||||
}
|
||||
@@ -354,7 +352,8 @@ public class ManagementSecurityAutoConfiguration {
|
||||
paths.add(path + "/**");
|
||||
// Add Spring MVC-generated additional paths
|
||||
paths.add(path + ".*");
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
paths.add("/");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
* Copyright 2012-2015 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.
|
||||
@@ -18,7 +18,6 @@ package org.springframework.boot.actuate.endpoint.mvc;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.ManagementServerProperties;
|
||||
import org.springframework.boot.actuate.endpoint.Endpoint;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
@@ -26,45 +25,28 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* {@link MvcEndpoint} to expose actuator documentation.
|
||||
*
|
||||
* @author Dave Syer
|
||||
* @since 1.3.0
|
||||
*/
|
||||
@ConfigurationProperties("endpoints.docs")
|
||||
public class ActuatorDocsEndpoint extends WebMvcConfigurerAdapter implements MvcEndpoint {
|
||||
|
||||
private static final String DOCS_LOCATION = "classpath:/META-INF/resources/spring-boot-actuator/docs/";
|
||||
|
||||
private String path = "/docs";
|
||||
|
||||
private boolean sensitive;
|
||||
|
||||
private ManagementServerProperties management;
|
||||
|
||||
|
||||
private Curies curies = new Curies();
|
||||
|
||||
public Curies getCuries() {
|
||||
return this.curies;
|
||||
}
|
||||
|
||||
/**
|
||||
* Properties of the default CurieProvider (used for adding docs links). If enabled, all
|
||||
* unqualified rels will pick up a prefix and a curie template pointing to the docs endpoint.
|
||||
*
|
||||
*/
|
||||
public static class Curies {
|
||||
/**
|
||||
* Enable the curie generation (off by default).
|
||||
*/
|
||||
private boolean enabled = false;
|
||||
|
||||
public boolean isEnabled() {
|
||||
return this.enabled;
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
}
|
||||
|
||||
public ActuatorDocsEndpoint(ManagementServerProperties management) {
|
||||
this.management = management;
|
||||
}
|
||||
@@ -82,8 +64,7 @@ public class ActuatorDocsEndpoint extends WebMvcConfigurerAdapter implements Mvc
|
||||
@Override
|
||||
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||
registry.addResourceHandler(this.management.getContextPath() + this.path + "/**")
|
||||
.addResourceLocations(
|
||||
"classpath:/META-INF/resources/spring-boot-actuator/docs/");
|
||||
.addResourceLocations(DOCS_LOCATION);
|
||||
}
|
||||
|
||||
public void setPath(String path) {
|
||||
@@ -109,4 +90,26 @@ public class ActuatorDocsEndpoint extends WebMvcConfigurerAdapter implements Mvc
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Properties of the default CurieProvider (used for adding docs links). If enabled,
|
||||
* all unqualified rels will pick up a prefix and a curie template pointing to the
|
||||
* docs endpoint.
|
||||
*/
|
||||
public static class Curies {
|
||||
|
||||
/**
|
||||
* Enable the curie generation (off by default).
|
||||
*/
|
||||
private boolean enabled = false;
|
||||
|
||||
public boolean isEnabled() {
|
||||
return this.enabled;
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
public class EnvironmentMvcEndpoint extends EndpointMvcAdapter implements
|
||||
EnvironmentAware {
|
||||
EnvironmentAware {
|
||||
|
||||
private Environment environment;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
* Copyright 2012-2015 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.
|
||||
@@ -25,14 +25,19 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* {@link MvcEndpoint} to support the Spring Data HAL browser.
|
||||
*
|
||||
* @author Dave Syer
|
||||
* @since 1.3.0
|
||||
*/
|
||||
@ConfigurationProperties("endpoints.hal")
|
||||
public class HalBrowserEndpoint extends WebMvcConfigurerAdapter implements MvcEndpoint {
|
||||
|
||||
private static final String HAL_BROWSER_VERSION = "b7669f1-1";
|
||||
|
||||
private static final String HAL_BROWSER_LOCATION = "classpath:/META-INF/resources/webjars/hal-browser/"
|
||||
+ HAL_BROWSER_VERSION + "/";
|
||||
|
||||
private String path = "";
|
||||
|
||||
private ManagementServerProperties management;
|
||||
@@ -58,16 +63,11 @@ public class HalBrowserEndpoint extends WebMvcConfigurerAdapter implements MvcEn
|
||||
|
||||
@Override
|
||||
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||
// Make sure the root path is not cached otherwise the browser won't come back for
|
||||
// the JSON
|
||||
// Make sure the root path is not cached so the browser comes back for the JSON
|
||||
registry.addResourceHandler(this.management.getContextPath() + this.path + "/")
|
||||
.addResourceLocations(
|
||||
"classpath:/META-INF/resources/webjars/hal-browser/"
|
||||
+ HAL_BROWSER_VERSION + "/").setCachePeriod(0);
|
||||
.addResourceLocations(HAL_BROWSER_LOCATION).setCachePeriod(0);
|
||||
registry.addResourceHandler(this.management.getContextPath() + this.path + "/**")
|
||||
.addResourceLocations(
|
||||
"classpath:/META-INF/resources/webjars/hal-browser/"
|
||||
+ HAL_BROWSER_VERSION + "/");
|
||||
.addResourceLocations(HAL_BROWSER_LOCATION);
|
||||
}
|
||||
|
||||
public void setPath(String path) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
* Copyright 2012-2015 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.
|
||||
@@ -22,11 +22,16 @@ import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* Annotation to that {@link MvcEndpoint} class or {@link RequestMapping} method should't
|
||||
* generate a hypermedia response.
|
||||
*
|
||||
* @author Dave Syer
|
||||
* @since 1.3.0
|
||||
*/
|
||||
@Target({ElementType.TYPE, ElementType.METHOD})
|
||||
@Target({ ElementType.TYPE, ElementType.METHOD })
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface HypermediaDisabled {
|
||||
|
||||
@@ -47,7 +47,7 @@ import org.springframework.web.util.UrlPathHelper;
|
||||
@ConfigurationProperties(prefix = "endpoints.jolokia", ignoreUnknownFields = false)
|
||||
@HypermediaDisabled
|
||||
public class JolokiaMvcEndpoint implements MvcEndpoint, InitializingBean,
|
||||
ApplicationContextAware, ServletContextAware {
|
||||
ApplicationContextAware, ServletContextAware {
|
||||
|
||||
/**
|
||||
* Endpoint URL path.
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.actuate.endpoint.mvc;
|
||||
|
||||
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||
|
||||
import org.springframework.hateoas.ResourceSupport;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
*
|
||||
*/
|
||||
public class LinksEnhancer {
|
||||
|
||||
private MvcEndpoints endpoints;
|
||||
|
||||
private String rootPath;
|
||||
|
||||
public LinksEnhancer(MvcEndpoints endpoints, String rootPath) {
|
||||
this.endpoints = endpoints;
|
||||
this.rootPath = rootPath;
|
||||
}
|
||||
|
||||
public void addEndpointLinks(ResourceSupport resource, String self) {
|
||||
if (!resource.hasLink("self")) {
|
||||
resource.add(linkTo(LinksEnhancer.class).slash(
|
||||
this.rootPath + self).withSelfRel());
|
||||
}
|
||||
for (MvcEndpoint endpoint : this.endpoints.getEndpoints()) {
|
||||
if (endpoint.getPath().equals(self)) {
|
||||
continue;
|
||||
}
|
||||
Class<?> type = endpoint.getEndpointType();
|
||||
if (type == null) {
|
||||
type = Object.class;
|
||||
}
|
||||
String path = endpoint.getPath();
|
||||
String rel = path.startsWith("/") ? path.substring(1) : path;
|
||||
if (StringUtils.hasText(rel)) {
|
||||
resource.add(linkTo(type).slash(this.rootPath + endpoint.getPath())
|
||||
.withRel(rel));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
* Copyright 2013-2015 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.
|
||||
@@ -24,8 +24,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* {@link MvcEndpoint} to add hypermedia links.
|
||||
*
|
||||
* @author Dave Syer
|
||||
* @since 1.3.0
|
||||
*/
|
||||
@ConfigurationProperties("endpoints.links")
|
||||
public class LinksMvcEndpoint implements MvcEndpoint {
|
||||
@@ -37,7 +39,7 @@ public class LinksMvcEndpoint implements MvcEndpoint {
|
||||
this.path = defaultPath;
|
||||
}
|
||||
|
||||
@RequestMapping(value = { "/", "" }, produces=MediaType.APPLICATION_JSON_VALUE)
|
||||
@RequestMapping(value = { "/", "" }, produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
@ResponseBody
|
||||
public ResourceSupport links() {
|
||||
ResourceSupport resource = new ResourceSupport();
|
||||
|
||||
@@ -1,9 +1,20 @@
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -24,6 +35,11 @@ import org.springframework.test.web.servlet.MvcResult;
|
||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@SpringApplicationConfiguration(classes = SpringBootHypermediaApplication.class)
|
||||
@WebAppConfiguration
|
||||
@@ -55,8 +71,8 @@ public class BrowserPathHypermediaIntegrationTests {
|
||||
@Test
|
||||
public void redirect() throws Exception {
|
||||
this.mockMvc.perform(get("/hal").accept(MediaType.TEXT_HTML))
|
||||
.andExpect(status().isFound())
|
||||
.andExpect(header().string("location", "/hal/#"));
|
||||
.andExpect(status().isFound())
|
||||
.andExpect(header().string("location", "/hal/#"));
|
||||
}
|
||||
|
||||
@MinimalActuatorHypermediaApplication
|
||||
@@ -66,6 +82,7 @@ public class BrowserPathHypermediaIntegrationTests {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SpringBootHypermediaApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,9 +1,20 @@
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -26,6 +37,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
|
||||
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@SpringApplicationConfiguration(classes = SpringBootHypermediaApplication.class)
|
||||
@WebAppConfiguration
|
||||
@@ -49,24 +65,24 @@ public class ContextPathHypermediaIntegrationTests {
|
||||
@Test
|
||||
public void home() throws Exception {
|
||||
this.mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk()).andExpect(jsonPath("$._links").exists());
|
||||
.andExpect(status().isOk()).andExpect(jsonPath("$._links").exists());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void links() throws Exception {
|
||||
this.mockMvc.perform(get("/admin").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk()).andExpect(jsonPath("$._links").exists());
|
||||
.andExpect(status().isOk()).andExpect(jsonPath("$._links").exists());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void trace() throws Exception {
|
||||
this.mockMvc
|
||||
.perform(get("/admin/trace").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(
|
||||
jsonPath("$._links.self.href").value(
|
||||
"http://localhost/admin/trace"))
|
||||
.andExpect(jsonPath("$.content").isArray());
|
||||
.perform(get("/admin/trace").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(
|
||||
jsonPath("$._links.self.href").value(
|
||||
"http://localhost/admin/trace"))
|
||||
.andExpect(jsonPath("$.content").isArray());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -76,11 +92,11 @@ public class ContextPathHypermediaIntegrationTests {
|
||||
path = path.startsWith("/") ? path.substring(1) : path;
|
||||
path = path.length() > 0 ? path : "self";
|
||||
this.mockMvc
|
||||
.perform(get("/admin").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(
|
||||
jsonPath("$._links.%s.href", path).value(
|
||||
"http://localhost/admin" + endpoint.getPath()));
|
||||
.perform(get("/admin").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(
|
||||
jsonPath("$._links.%s.href", path).value(
|
||||
"http://localhost/admin" + endpoint.getPath()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,8 +114,9 @@ public class ContextPathHypermediaIntegrationTests {
|
||||
|
||||
public static void main(String[] args) {
|
||||
new SpringApplicationBuilder(SpringBootHypermediaApplication.class)
|
||||
.properties("management.contextPath:/admin").run(args);
|
||||
.properties("management.contextPath:/admin").run(args);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,9 +1,20 @@
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -25,6 +36,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
|
||||
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@SpringApplicationConfiguration(classes = SpringBootHypermediaApplication.class)
|
||||
@WebAppConfiguration
|
||||
@@ -47,7 +63,7 @@ public class CustomHomepageHypermediaIntegrationTests {
|
||||
@Test
|
||||
public void links() throws Exception {
|
||||
this.mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk()).andExpect(jsonPath("$._links").exists());
|
||||
.andExpect(status().isOk()).andExpect(jsonPath("$._links").exists());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -56,8 +72,8 @@ public class CustomHomepageHypermediaIntegrationTests {
|
||||
String path = endpoint.getPath();
|
||||
path = path.startsWith("/") ? path.substring(1) : path;
|
||||
this.mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(jsonPath("$._links.%s.href", path).exists());
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(jsonPath("$._links.%s.href", path).exists());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,13 +84,15 @@ public class CustomHomepageHypermediaIntegrationTests {
|
||||
@RequestMapping("")
|
||||
public ResourceSupport home() {
|
||||
ResourceSupport resource = new ResourceSupport();
|
||||
resource.add(linkTo(SpringBootHypermediaApplication.class).slash("/").withSelfRel());
|
||||
resource.add(linkTo(SpringBootHypermediaApplication.class).slash("/")
|
||||
.withSelfRel());
|
||||
return resource;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SpringBootHypermediaApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2015 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.
|
||||
@@ -16,9 +16,6 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
@@ -63,6 +60,9 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
||||
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Integration tests for MVC {@link Endpoint}s.
|
||||
*
|
||||
@@ -94,19 +94,19 @@ public class EndpointMvcIntegrationTests {
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
@Import({ EmbeddedServletContainerAutoConfiguration.class,
|
||||
ServerPropertiesAutoConfiguration.class,
|
||||
DispatcherServletAutoConfiguration.class, WebMvcAutoConfiguration.class,
|
||||
JacksonAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
ErrorMvcAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class })
|
||||
ServerPropertiesAutoConfiguration.class,
|
||||
DispatcherServletAutoConfiguration.class, WebMvcAutoConfiguration.class,
|
||||
JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class,
|
||||
ErrorMvcAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class })
|
||||
protected static @interface MinimalWebConfiguration {
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@MinimalWebConfiguration
|
||||
@Import({ ManagementServerPropertiesAutoConfiguration.class, JacksonAutoConfiguration.class,
|
||||
EndpointAutoConfiguration.class, EndpointWebMvcAutoConfiguration.class })
|
||||
@Import({ ManagementServerPropertiesAutoConfiguration.class,
|
||||
JacksonAutoConfiguration.class, EndpointAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class })
|
||||
@RestController
|
||||
protected static class Application {
|
||||
|
||||
|
||||
@@ -16,18 +16,6 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.instanceOf;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.hamcrest.Matchers.not;
|
||||
import static org.hamcrest.Matchers.notNullValue;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.net.SocketException;
|
||||
import java.net.URI;
|
||||
@@ -84,6 +72,18 @@ import org.springframework.web.servlet.ModelAndView;
|
||||
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
||||
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
|
||||
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.instanceOf;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.hamcrest.Matchers.not;
|
||||
import static org.hamcrest.Matchers.notNullValue;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* Tests for {@link EndpointWebMvcAutoConfiguration}.
|
||||
*
|
||||
@@ -228,8 +228,7 @@ public class EndpointWebMvcAutoConfigurationTests {
|
||||
this.applicationContext.register(RootConfig.class, EndpointConfig.class,
|
||||
ServerPortConfig.class, PropertyPlaceholderAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
ServerPropertiesAutoConfiguration.class,
|
||||
JacksonAutoConfiguration.class,
|
||||
ServerPropertiesAutoConfiguration.class, JacksonAutoConfiguration.class,
|
||||
EmbeddedServletContainerAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
DispatcherServletAutoConfiguration.class, WebMvcAutoConfiguration.class,
|
||||
@@ -246,7 +245,7 @@ public class EndpointWebMvcAutoConfigurationTests {
|
||||
this.applicationContext.register(RootConfig.class, BaseConfiguration.class,
|
||||
ServerPortConfig.class, EndpointWebMvcAutoConfiguration.class);
|
||||
new ServerPortInfoApplicationContextInitializer()
|
||||
.initialize(this.applicationContext);
|
||||
.initialize(this.applicationContext);
|
||||
this.applicationContext.refresh();
|
||||
Integer localServerPort = this.applicationContext.getEnvironment().getProperty(
|
||||
"local.server.port", Integer.class);
|
||||
@@ -262,7 +261,7 @@ public class EndpointWebMvcAutoConfigurationTests {
|
||||
@Test
|
||||
public void portPropertiesOnDifferentPort() throws Exception {
|
||||
new ServerPortInfoApplicationContextInitializer()
|
||||
.initialize(this.applicationContext);
|
||||
.initialize(this.applicationContext);
|
||||
this.applicationContext.register(RootConfig.class, DifferentPortConfig.class,
|
||||
BaseConfiguration.class, EndpointWebMvcAutoConfiguration.class,
|
||||
ErrorMvcAutoConfiguration.class);
|
||||
@@ -423,13 +422,12 @@ public class EndpointWebMvcAutoConfigurationTests {
|
||||
|
||||
@Configuration
|
||||
@Import({ PropertyPlaceholderAutoConfiguration.class,
|
||||
EmbeddedServletContainerAutoConfiguration.class,
|
||||
JacksonAutoConfiguration.class,
|
||||
EndpointAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
DispatcherServletAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
ServerPropertiesAutoConfiguration.class, WebMvcAutoConfiguration.class })
|
||||
EmbeddedServletContainerAutoConfiguration.class,
|
||||
JacksonAutoConfiguration.class, EndpointAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
DispatcherServletAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
ServerPropertiesAutoConfiguration.class, WebMvcAutoConfiguration.class })
|
||||
protected static class BaseConfiguration {
|
||||
|
||||
}
|
||||
@@ -587,7 +585,7 @@ public class EndpointWebMvcAutoConfigurationTests {
|
||||
}
|
||||
|
||||
private static class GrabManagementPort implements
|
||||
ApplicationListener<EmbeddedServletContainerInitializedEvent> {
|
||||
ApplicationListener<EmbeddedServletContainerInitializedEvent> {
|
||||
|
||||
private ApplicationContext rootContext;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
* Copyright 2012-2015 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.
|
||||
@@ -16,8 +16,6 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
import org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint;
|
||||
@@ -33,6 +31,8 @@ import org.springframework.mock.web.MockServletContext;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* Tests for {@link EndpointWebMvcAutoConfiguration} of the {@link HealthMvcEndpoint}.
|
||||
*
|
||||
|
||||
@@ -16,13 +16,6 @@
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import static org.hamcrest.Matchers.greaterThan;
|
||||
import static org.hamcrest.Matchers.hasSize;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import javax.servlet.Filter;
|
||||
|
||||
import org.hamcrest.Matchers;
|
||||
@@ -60,6 +53,13 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
|
||||
|
||||
import static org.hamcrest.Matchers.greaterThan;
|
||||
import static org.hamcrest.Matchers.hasSize;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Tests for {@link ManagementSecurityAutoConfiguration}.
|
||||
*
|
||||
@@ -111,8 +111,7 @@ public class ManagementSecurityAutoConfigurationTests {
|
||||
this.context = new AnnotationConfigWebApplicationContext();
|
||||
this.context.setServletContext(new MockServletContext());
|
||||
this.context.register(EndpointAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class,
|
||||
JacksonAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class, JacksonAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
SecurityAutoConfiguration.class,
|
||||
@@ -122,7 +121,7 @@ public class ManagementSecurityAutoConfigurationTests {
|
||||
UserDetails user = getUser();
|
||||
assertTrue(user.getAuthorities().containsAll(
|
||||
AuthorityUtils
|
||||
.commaSeparatedStringToAuthorityList("ROLE_USER,ROLE_ADMIN")));
|
||||
.commaSeparatedStringToAuthorityList("ROLE_USER,ROLE_ADMIN")));
|
||||
}
|
||||
|
||||
private UserDetails getUser() {
|
||||
@@ -157,8 +156,8 @@ public class ManagementSecurityAutoConfigurationTests {
|
||||
this.context = new AnnotationConfigWebApplicationContext();
|
||||
this.context.setServletContext(new MockServletContext());
|
||||
this.context.register(HttpMessageConvertersAutoConfiguration.class,
|
||||
JacksonAutoConfiguration.class,
|
||||
EndpointAutoConfiguration.class, EndpointWebMvcAutoConfiguration.class,
|
||||
JacksonAutoConfiguration.class, EndpointAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
SecurityAutoConfiguration.class,
|
||||
ManagementSecurityAutoConfiguration.class,
|
||||
@@ -205,15 +204,16 @@ public class ManagementSecurityAutoConfigurationTests {
|
||||
public void realmSameForManagement() throws Exception {
|
||||
this.context = new AnnotationConfigWebApplicationContext();
|
||||
this.context.setServletContext(new MockServletContext());
|
||||
this.context.register(AuthenticationConfig.class,
|
||||
SecurityAutoConfiguration.class,
|
||||
ManagementSecurityAutoConfiguration.class,
|
||||
JacksonAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
EndpointAutoConfiguration.class, EndpointWebMvcAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
WebMvcAutoConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class);
|
||||
this.context
|
||||
.register(AuthenticationConfig.class, SecurityAutoConfiguration.class,
|
||||
ManagementSecurityAutoConfiguration.class,
|
||||
JacksonAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
EndpointAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
WebMvcAutoConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class);
|
||||
this.context.refresh();
|
||||
|
||||
Filter filter = this.context.getBean("springSecurityFilterChain", Filter.class);
|
||||
@@ -222,8 +222,8 @@ public class ManagementSecurityAutoConfigurationTests {
|
||||
|
||||
// no user (Main)
|
||||
mockMvc.perform(MockMvcRequestBuilders.get("/home"))
|
||||
.andExpect(MockMvcResultMatchers.status().isUnauthorized())
|
||||
.andExpect(springAuthenticateRealmHeader());
|
||||
.andExpect(MockMvcResultMatchers.status().isUnauthorized())
|
||||
.andExpect(springAuthenticateRealmHeader());
|
||||
|
||||
// invalid user (Main)
|
||||
mockMvc.perform(
|
||||
@@ -233,8 +233,8 @@ public class ManagementSecurityAutoConfigurationTests {
|
||||
|
||||
// no user (Management)
|
||||
mockMvc.perform(MockMvcRequestBuilders.get("/beans"))
|
||||
.andExpect(MockMvcResultMatchers.status().isUnauthorized())
|
||||
.andExpect(springAuthenticateRealmHeader());
|
||||
.andExpect(MockMvcResultMatchers.status().isUnauthorized())
|
||||
.andExpect(springAuthenticateRealmHeader());
|
||||
|
||||
// invalid user (Management)
|
||||
mockMvc.perform(
|
||||
@@ -254,7 +254,7 @@ public class ManagementSecurityAutoConfigurationTests {
|
||||
@Autowired
|
||||
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
|
||||
auth.inMemoryAuthentication().withUser("user").password("password")
|
||||
.roles("USER");
|
||||
.roles("USER");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
* Copyright 2012-2015 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.
|
||||
@@ -36,20 +36,19 @@ import org.springframework.context.annotation.Import;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
*
|
||||
*/
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
@Configuration
|
||||
@Import({ ServerPropertiesAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
EmbeddedServletContainerAutoConfiguration.class,
|
||||
DispatcherServletAutoConfiguration.class, JacksonAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class, WebMvcAutoConfiguration.class,
|
||||
HypermediaAutoConfiguration.class, EndpointAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class, ErrorMvcAutoConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class })
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
EmbeddedServletContainerAutoConfiguration.class,
|
||||
DispatcherServletAutoConfiguration.class, JacksonAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class, WebMvcAutoConfiguration.class,
|
||||
HypermediaAutoConfiguration.class, EndpointAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class, ErrorMvcAutoConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class })
|
||||
public @interface MinimalActuatorHypermediaApplication {
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,20 @@
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@@ -27,6 +39,10 @@ import org.springframework.test.context.web.WebAppConfiguration;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@SpringApplicationConfiguration(classes = SpringBootHypermediaApplication.class)
|
||||
@WebAppConfiguration
|
||||
@@ -57,8 +73,7 @@ public class ServerContextPathHypermediaIntegrationTests {
|
||||
"http://localhost:" + this.port + "/spring/", HttpMethod.GET,
|
||||
new HttpEntity<Void>(null, headers), String.class);
|
||||
assertEquals(HttpStatus.OK, entity.getStatusCode());
|
||||
assertTrue("Wrong body: " + entity.getBody(),
|
||||
entity.getBody().contains("<title"));
|
||||
assertTrue("Wrong body: " + entity.getBody(), entity.getBody().contains("<title"));
|
||||
}
|
||||
|
||||
@MinimalActuatorHypermediaApplication
|
||||
@@ -75,8 +90,9 @@ public class ServerContextPathHypermediaIntegrationTests {
|
||||
|
||||
public static void main(String[] args) {
|
||||
new SpringApplicationBuilder(SpringBootHypermediaApplication.class)
|
||||
.properties("server.contextPath=/spring").run(args);
|
||||
.properties("server.contextPath=/spring").run(args);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,20 @@
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@@ -27,6 +39,10 @@ import org.springframework.test.context.web.WebAppConfiguration;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
|
||||
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@SpringApplicationConfiguration(classes = SpringBootHypermediaApplication.class)
|
||||
@WebAppConfiguration
|
||||
@@ -74,8 +90,9 @@ public class ServerPortHypermediaIntegrationTests {
|
||||
|
||||
public static void main(String[] args) {
|
||||
new SpringApplicationBuilder(SpringBootHypermediaApplication.class)
|
||||
.properties("management.port:9000").run(args);
|
||||
.properties("management.port:9000").run(args);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,10 +1,20 @@
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
/*
|
||||
* Copyright 2012-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -25,6 +35,12 @@ import org.springframework.test.web.servlet.MvcResult;
|
||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@SpringApplicationConfiguration(classes = SpringBootHypermediaApplication.class)
|
||||
@WebAppConfiguration
|
||||
@@ -47,8 +63,8 @@ public class VanillaHypermediaIntegrationTests {
|
||||
@Test
|
||||
public void links() throws Exception {
|
||||
this.mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk()).andExpect(jsonPath("$._links").exists())
|
||||
.andExpect(header().doesNotExist("cache-control"));
|
||||
.andExpect(status().isOk()).andExpect(jsonPath("$._links").exists())
|
||||
.andExpect(header().doesNotExist("cache-control"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -61,17 +77,17 @@ public class VanillaHypermediaIntegrationTests {
|
||||
@Test
|
||||
public void trace() throws Exception {
|
||||
this.mockMvc
|
||||
.perform(get("/trace").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(jsonPath("$._links.self.href").value("http://localhost/trace"))
|
||||
.andExpect(jsonPath("$.content").isArray());
|
||||
.perform(get("/trace").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(jsonPath("$._links.self.href").value("http://localhost/trace"))
|
||||
.andExpect(jsonPath("$.content").isArray());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void envValue() throws Exception {
|
||||
this.mockMvc.perform(get("/env/user.home").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(jsonPath("$._links").doesNotExist());
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(jsonPath("$._links").doesNotExist());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -80,8 +96,8 @@ public class VanillaHypermediaIntegrationTests {
|
||||
String path = endpoint.getPath();
|
||||
path = path.startsWith("/") ? path.substring(1) : path;
|
||||
this.mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(jsonPath("$._links.%s.href", path).exists());
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(jsonPath("$._links.%s.href", path).exists());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,11 +111,11 @@ public class VanillaHypermediaIntegrationTests {
|
||||
}
|
||||
path = path.length() > 0 ? path : "/";
|
||||
this.mockMvc
|
||||
.perform(get(path).accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(
|
||||
jsonPath("$._links.self.href").value(
|
||||
"http://localhost" + endpoint.getPath()));
|
||||
.perform(get(path).accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(
|
||||
jsonPath("$._links.self.href").value(
|
||||
"http://localhost" + endpoint.getPath()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,6 +126,7 @@ public class VanillaHypermediaIntegrationTests {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SpringBootHypermediaApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,12 +16,6 @@
|
||||
|
||||
package org.springframework.boot.actuate.endpoint.mvc;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.hamcrest.Matchers.equalToIgnoringCase;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -45,6 +39,12 @@ import org.springframework.test.web.servlet.MockMvc;
|
||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.hamcrest.Matchers.equalToIgnoringCase;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
/**
|
||||
* Tests for {@link EnvironmentMvcEndpoint}
|
||||
*
|
||||
@@ -72,13 +72,13 @@ public class EnvironmentMvcEndpointTests {
|
||||
@Test
|
||||
public void home() throws Exception {
|
||||
this.mvc.perform(get("/env")).andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("systemProperties")));
|
||||
.andExpect(content().string(containsString("systemProperties")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sub() throws Exception {
|
||||
this.mvc.perform(get("/env/foo")).andExpect(status().isOk())
|
||||
.andExpect(content().string(equalToIgnoringCase("bar")));
|
||||
.andExpect(content().string(equalToIgnoringCase("bar")));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -90,15 +90,14 @@ public class EnvironmentMvcEndpointTests {
|
||||
@Test
|
||||
public void regex() throws Exception {
|
||||
this.mvc.perform(get("/env/foo.*")).andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("\"foo\":\"bar\"")))
|
||||
.andExpect(content().string(containsString("\"fool\":\"baz\"")));
|
||||
.andExpect(content().string(containsString("\"foo\":\"bar\"")))
|
||||
.andExpect(content().string(containsString("\"fool\":\"baz\"")));
|
||||
}
|
||||
|
||||
@Import({ JacksonAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
WebMvcAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class })
|
||||
HttpMessageConvertersAutoConfiguration.class, WebMvcAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class })
|
||||
@Configuration
|
||||
public static class TestConfiguration {
|
||||
|
||||
|
||||
@@ -16,11 +16,6 @@
|
||||
|
||||
package org.springframework.boot.actuate.endpoint.mvc;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -46,6 +41,11 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
/**
|
||||
* @author Christian Dupuis
|
||||
* @author Dave Syer
|
||||
@@ -73,22 +73,22 @@ public class JolokiaMvcEndpointContextPathTests {
|
||||
@Test
|
||||
public void read() throws Exception {
|
||||
this.mvc.perform(get("/admin/jolokia/read/java.lang:type=Memory"))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("NonHeapMemoryUsage")));
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("NonHeapMemoryUsage")));
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableConfigurationProperties
|
||||
@EnableWebMvc
|
||||
@Import({ JacksonAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class, JolokiaAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class })
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class, JolokiaAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class })
|
||||
public static class Config {
|
||||
}
|
||||
|
||||
public static class ContextPathListener implements
|
||||
ApplicationContextInitializer<ConfigurableApplicationContext> {
|
||||
ApplicationContextInitializer<ConfigurableApplicationContext> {
|
||||
@Override
|
||||
public void initialize(ConfigurableApplicationContext context) {
|
||||
EnvironmentTestUtils.addEnvironment(context, "management.contextPath:/admin");
|
||||
|
||||
@@ -16,14 +16,6 @@
|
||||
|
||||
package org.springframework.boot.actuate.endpoint.mvc;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.hamcrest.Matchers.hasItem;
|
||||
import static org.hamcrest.Matchers.instanceOf;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.hamcrest.Matcher;
|
||||
@@ -50,6 +42,14 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.hamcrest.Matchers.hasItem;
|
||||
import static org.hamcrest.Matchers.instanceOf;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
/**
|
||||
* Tests for {@link JolokiaMvcEndpoint}
|
||||
*
|
||||
@@ -86,30 +86,30 @@ public class JolokiaMvcEndpointTests {
|
||||
@Test
|
||||
public void search() throws Exception {
|
||||
this.mvc.perform(get("/jolokia/search/java.lang:*")).andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("GarbageCollector")));
|
||||
.andExpect(content().string(containsString("GarbageCollector")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void read() throws Exception {
|
||||
this.mvc.perform(get("/jolokia/read/java.lang:type=Memory"))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("NonHeapMemoryUsage")));
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("NonHeapMemoryUsage")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void list() throws Exception {
|
||||
this.mvc.perform(get("/jolokia/list/java.lang/type=Memory/attr"))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("NonHeapMemoryUsage")));
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("NonHeapMemoryUsage")));
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableConfigurationProperties
|
||||
@EnableWebMvc
|
||||
@Import({ JacksonAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class, JolokiaAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class })
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class, JolokiaAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class })
|
||||
public static class Config {
|
||||
|
||||
}
|
||||
|
||||
@@ -16,12 +16,6 @@
|
||||
|
||||
package org.springframework.boot.actuate.endpoint.mvc;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
@@ -49,6 +43,12 @@ import org.springframework.test.web.servlet.MockMvc;
|
||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
/**
|
||||
* Tests for {@link MetricsMvcEndpoint}
|
||||
*
|
||||
@@ -74,7 +74,7 @@ public class MetricsMvcEndpointTests {
|
||||
@Test
|
||||
public void home() throws Exception {
|
||||
this.mvc.perform(get("/metrics")).andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("\"foo\":1")));
|
||||
.andExpect(content().string(containsString("\"foo\":1")));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -86,7 +86,7 @@ public class MetricsMvcEndpointTests {
|
||||
@Test
|
||||
public void specificMetric() throws Exception {
|
||||
this.mvc.perform(get("/metrics/foo")).andExpect(status().isOk())
|
||||
.andExpect(content().string(equalTo("1")));
|
||||
.andExpect(content().string(equalTo("1")));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -104,35 +104,34 @@ public class MetricsMvcEndpointTests {
|
||||
public void regexAll() throws Exception {
|
||||
String expected = "\"foo\":1,\"group1.a\":1,\"group1.b\":1,\"group2.a\":1,\"group2_a\":1";
|
||||
this.mvc.perform(get("/metrics/.*")).andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString(expected)));
|
||||
.andExpect(content().string(containsString(expected)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void regexGroupDot() throws Exception {
|
||||
String expected = "\"group1.a\":1,\"group1.b\":1,\"group2.a\":1";
|
||||
this.mvc.perform(get("/metrics/group[0-9]+\\..*")).andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString(expected)));
|
||||
.andExpect(content().string(containsString(expected)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void regexGroup1() throws Exception {
|
||||
String expected = "\"group1.a\":1,\"group1.b\":1";
|
||||
this.mvc.perform(get("/metrics/group1\\..*")).andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString(expected)));
|
||||
.andExpect(content().string(containsString(expected)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void specificMetricWithDot() throws Exception {
|
||||
this.mvc.perform(get("/metrics/group2.a")).andExpect(status().isOk())
|
||||
.andExpect(content().string(containsString("1")));
|
||||
.andExpect(content().string(containsString("1")));
|
||||
|
||||
}
|
||||
|
||||
@Import({ JacksonAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class,
|
||||
WebMvcAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class })
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
EndpointWebMvcAutoConfiguration.class, WebMvcAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class })
|
||||
@Configuration
|
||||
public static class TestConfiguration {
|
||||
|
||||
|
||||
@@ -16,10 +16,6 @@
|
||||
|
||||
package org.springframework.boot.actuate.endpoint.mvc;
|
||||
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.options;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration;
|
||||
@@ -38,6 +34,10 @@ import org.springframework.test.web.servlet.ResultActions;
|
||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
|
||||
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.options;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
/**
|
||||
* Integration tests for the actuator endpoints' CORS support
|
||||
*
|
||||
@@ -51,7 +51,8 @@ public class MvcEndpointCorsIntegrationTests {
|
||||
public void createContext() {
|
||||
this.context = new AnnotationConfigWebApplicationContext();
|
||||
this.context.setServletContext(new MockServletContext());
|
||||
this.context.register(JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class,
|
||||
this.context.register(JacksonAutoConfiguration.class,
|
||||
HttpMessageConvertersAutoConfiguration.class,
|
||||
EndpointAutoConfiguration.class, EndpointWebMvcAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class,
|
||||
@@ -63,7 +64,7 @@ public class MvcEndpointCorsIntegrationTests {
|
||||
createMockMvc().perform(
|
||||
options("/beans").header("Origin", "foo.example.com").header(
|
||||
HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")).andExpect(
|
||||
header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN));
|
||||
header().doesNotExist(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -73,7 +74,7 @@ public class MvcEndpointCorsIntegrationTests {
|
||||
createMockMvc().perform(
|
||||
options("/beans").header("Origin", "bar.example.com").header(
|
||||
HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")).andExpect(
|
||||
status().isForbidden());
|
||||
status().isForbidden());
|
||||
performAcceptedCorsRequest();
|
||||
}
|
||||
|
||||
@@ -100,8 +101,8 @@ public class MvcEndpointCorsIntegrationTests {
|
||||
"endpoints.cors.allowed-origins:foo.example.com");
|
||||
createMockMvc().perform(
|
||||
options("/beans").header("Origin", "foo.example.com")
|
||||
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")
|
||||
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS, "Alpha"))
|
||||
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")
|
||||
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS, "Alpha"))
|
||||
.andExpect(status().isForbidden());
|
||||
}
|
||||
|
||||
@@ -111,15 +112,15 @@ public class MvcEndpointCorsIntegrationTests {
|
||||
"endpoints.cors.allowed-origins:foo.example.com",
|
||||
"endpoints.cors.allowed-headers:Alpha,Bravo");
|
||||
createMockMvc()
|
||||
.perform(
|
||||
options("/beans")
|
||||
.header("Origin", "foo.example.com")
|
||||
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")
|
||||
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS,
|
||||
"Alpha"))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(
|
||||
header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "Alpha"));
|
||||
.perform(
|
||||
options("/beans")
|
||||
.header("Origin", "foo.example.com")
|
||||
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")
|
||||
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS,
|
||||
"Alpha"))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(
|
||||
header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "Alpha"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -129,7 +130,7 @@ public class MvcEndpointCorsIntegrationTests {
|
||||
createMockMvc().perform(
|
||||
options("/health").header(HttpHeaders.ORIGIN, "foo.example.com").header(
|
||||
HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "HEAD")).andExpect(
|
||||
status().isForbidden());
|
||||
status().isForbidden());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -138,10 +139,10 @@ public class MvcEndpointCorsIntegrationTests {
|
||||
"endpoints.cors.allowed-origins:foo.example.com",
|
||||
"endpoints.cors.allowed-methods:GET,HEAD");
|
||||
createMockMvc()
|
||||
.perform(
|
||||
options("/health")
|
||||
.header(HttpHeaders.ORIGIN, "foo.example.com")
|
||||
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "HEAD"))
|
||||
.perform(
|
||||
options("/health")
|
||||
.header(HttpHeaders.ORIGIN, "foo.example.com")
|
||||
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "HEAD"))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(
|
||||
header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS,
|
||||
@@ -173,7 +174,7 @@ public class MvcEndpointCorsIntegrationTests {
|
||||
createMockMvc().perform(
|
||||
options("/jolokia").header("Origin", "bar.example.com").header(
|
||||
HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")).andExpect(
|
||||
status().isForbidden());
|
||||
status().isForbidden());
|
||||
performAcceptedCorsRequest("/jolokia");
|
||||
}
|
||||
|
||||
@@ -190,10 +191,10 @@ public class MvcEndpointCorsIntegrationTests {
|
||||
return createMockMvc()
|
||||
.perform(
|
||||
options(url).header(HttpHeaders.ORIGIN, "foo.example.com")
|
||||
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET"))
|
||||
.andExpect(
|
||||
header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN,
|
||||
"foo.example.com")).andExpect(status().isOk());
|
||||
.header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET"))
|
||||
.andExpect(
|
||||
header().string(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN,
|
||||
"foo.example.com")).andExpect(status().isOk());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user