Add details of the request mapping conditions to mappings endpoint
Closes gh-12080pull/12068/merge
parent
2c19257d6d
commit
17c7f027e0
@ -0,0 +1,142 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012-2018 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.web.mappings.reactive;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.reactive.result.condition.MediaTypeExpression;
|
||||||
|
import org.springframework.web.reactive.result.condition.NameValueExpression;
|
||||||
|
import org.springframework.web.reactive.result.method.RequestMappingInfo;
|
||||||
|
import org.springframework.web.util.pattern.PathPattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Description of the conditions of a {@link RequestMappingInfo}.
|
||||||
|
*
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
* @since 2.0.0
|
||||||
|
*/
|
||||||
|
public class RequestMappingConditionsDescription {
|
||||||
|
|
||||||
|
private final List<MediaTypeExpressionDescription> consumes;
|
||||||
|
|
||||||
|
private final List<NameValueExpressionDescription> headers;
|
||||||
|
|
||||||
|
private final Set<RequestMethod> methods;
|
||||||
|
|
||||||
|
private final List<NameValueExpressionDescription> params;
|
||||||
|
|
||||||
|
private final Set<String> patterns;
|
||||||
|
|
||||||
|
private final List<MediaTypeExpressionDescription> produces;
|
||||||
|
|
||||||
|
RequestMappingConditionsDescription(RequestMappingInfo requestMapping) {
|
||||||
|
this.consumes = requestMapping.getConsumesCondition().getExpressions().stream()
|
||||||
|
.map(MediaTypeExpressionDescription::new).collect(Collectors.toList());
|
||||||
|
this.headers = requestMapping.getHeadersCondition().getExpressions().stream()
|
||||||
|
.map(NameValueExpressionDescription::new).collect(Collectors.toList());
|
||||||
|
this.methods = requestMapping.getMethodsCondition().getMethods();
|
||||||
|
this.params = requestMapping.getParamsCondition().getExpressions().stream()
|
||||||
|
.map(NameValueExpressionDescription::new).collect(Collectors.toList());
|
||||||
|
this.patterns = requestMapping.getPatternsCondition().getPatterns().stream()
|
||||||
|
.map(PathPattern::getPatternString).collect(Collectors.toSet());
|
||||||
|
this.produces = requestMapping.getProducesCondition().getExpressions().stream()
|
||||||
|
.map(MediaTypeExpressionDescription::new).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<MediaTypeExpressionDescription> getConsumes() {
|
||||||
|
return this.consumes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<NameValueExpressionDescription> getHeaders() {
|
||||||
|
return this.headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<RequestMethod> getMethods() {
|
||||||
|
return this.methods;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<NameValueExpressionDescription> getParams() {
|
||||||
|
return this.params;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getPatterns() {
|
||||||
|
return this.patterns;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<MediaTypeExpressionDescription> getProduces() {
|
||||||
|
return this.produces;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A description of a {@link MediaTypeExpression} in a request mapping condition.
|
||||||
|
*/
|
||||||
|
public static class MediaTypeExpressionDescription {
|
||||||
|
|
||||||
|
private final String mediaType;
|
||||||
|
|
||||||
|
private final boolean negated;
|
||||||
|
|
||||||
|
MediaTypeExpressionDescription(MediaTypeExpression expression) {
|
||||||
|
this.mediaType = expression.getMediaType().toString();
|
||||||
|
this.negated = expression.isNegated();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMediaType() {
|
||||||
|
return this.mediaType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNegated() {
|
||||||
|
return this.negated;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A description of a {@link NameValueExpression} in a request mapping condition.
|
||||||
|
*/
|
||||||
|
public static class NameValueExpressionDescription {
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
private final Object value;
|
||||||
|
|
||||||
|
private final boolean negated;
|
||||||
|
|
||||||
|
NameValueExpressionDescription(NameValueExpression<?> expression) {
|
||||||
|
this.name = expression.getName();
|
||||||
|
this.value = expression.getValue();
|
||||||
|
this.negated = expression.isNegated();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getValue() {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNegated() {
|
||||||
|
return this.negated;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,140 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012-2018 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.web.mappings.servlet;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.servlet.mvc.condition.MediaTypeExpression;
|
||||||
|
import org.springframework.web.servlet.mvc.condition.NameValueExpression;
|
||||||
|
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Description of the conditions of a {@link RequestMappingInfo}.
|
||||||
|
*
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
* @since 2.0.0
|
||||||
|
*/
|
||||||
|
public class RequestMappingConditionsDescription {
|
||||||
|
|
||||||
|
private final List<MediaTypeExpressionDescription> consumes;
|
||||||
|
|
||||||
|
private final List<NameValueExpressionDescription> headers;
|
||||||
|
|
||||||
|
private final Set<RequestMethod> methods;
|
||||||
|
|
||||||
|
private final List<NameValueExpressionDescription> params;
|
||||||
|
|
||||||
|
private final Set<String> patterns;
|
||||||
|
|
||||||
|
private final List<MediaTypeExpressionDescription> produces;
|
||||||
|
|
||||||
|
RequestMappingConditionsDescription(RequestMappingInfo requestMapping) {
|
||||||
|
this.consumes = requestMapping.getConsumesCondition().getExpressions().stream()
|
||||||
|
.map(MediaTypeExpressionDescription::new).collect(Collectors.toList());
|
||||||
|
this.headers = requestMapping.getHeadersCondition().getExpressions().stream()
|
||||||
|
.map(NameValueExpressionDescription::new).collect(Collectors.toList());
|
||||||
|
this.methods = requestMapping.getMethodsCondition().getMethods();
|
||||||
|
this.params = requestMapping.getParamsCondition().getExpressions().stream()
|
||||||
|
.map(NameValueExpressionDescription::new).collect(Collectors.toList());
|
||||||
|
this.patterns = requestMapping.getPatternsCondition().getPatterns();
|
||||||
|
this.produces = requestMapping.getProducesCondition().getExpressions().stream()
|
||||||
|
.map(MediaTypeExpressionDescription::new).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<MediaTypeExpressionDescription> getConsumes() {
|
||||||
|
return this.consumes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<NameValueExpressionDescription> getHeaders() {
|
||||||
|
return this.headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<RequestMethod> getMethods() {
|
||||||
|
return this.methods;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<NameValueExpressionDescription> getParams() {
|
||||||
|
return this.params;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getPatterns() {
|
||||||
|
return this.patterns;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<MediaTypeExpressionDescription> getProduces() {
|
||||||
|
return this.produces;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A description of a {@link MediaTypeExpression} in a request mapping condition.
|
||||||
|
*/
|
||||||
|
public static class MediaTypeExpressionDescription {
|
||||||
|
|
||||||
|
private final String mediaType;
|
||||||
|
|
||||||
|
private final boolean negated;
|
||||||
|
|
||||||
|
MediaTypeExpressionDescription(MediaTypeExpression expression) {
|
||||||
|
this.mediaType = expression.getMediaType().toString();
|
||||||
|
this.negated = expression.isNegated();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMediaType() {
|
||||||
|
return this.mediaType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNegated() {
|
||||||
|
return this.negated;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A description of a {@link NameValueExpression} in a request mapping condition.
|
||||||
|
*/
|
||||||
|
public static class NameValueExpressionDescription {
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
private final Object value;
|
||||||
|
|
||||||
|
private final boolean negated;
|
||||||
|
|
||||||
|
NameValueExpressionDescription(NameValueExpression<?> expression) {
|
||||||
|
this.name = expression.getName();
|
||||||
|
this.value = expression.getValue();
|
||||||
|
this.negated = expression.isNegated();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getValue() {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNegated() {
|
||||||
|
return this.negated;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package sample.webflux;
|
||||||
|
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
public class ExampleController {
|
||||||
|
|
||||||
|
@PostMapping(path = "/", consumes = { MediaType.APPLICATION_JSON_VALUE,
|
||||||
|
"!application/xml" }, produces = MediaType.TEXT_PLAIN_VALUE, headers = "X-Custom=Foo", params = "a!=alpha")
|
||||||
|
public String example() {
|
||||||
|
return "Hello World";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue