Commit ab01c55d authored by Stephane Nicoll's avatar Stephane Nicoll

Deprecate use of path extensions for request mapping and content negotiation

Closes gh-20528
parent 0c3be4dd
/* /*
* Copyright 2012-2019 the original author or authors. * Copyright 2012-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -220,6 +220,7 @@ public class WebMvcAutoConfiguration { ...@@ -220,6 +220,7 @@ public class WebMvcAutoConfiguration {
} }
@Override @Override
@SuppressWarnings("deprecation")
public void configurePathMatch(PathMatchConfigurer configurer) { public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(this.mvcProperties.getPathmatch().isUseSuffixPattern()); configurer.setUseSuffixPatternMatch(this.mvcProperties.getPathmatch().isUseSuffixPattern());
configurer.setUseRegisteredSuffixPatternMatch( configurer.setUseRegisteredSuffixPatternMatch(
...@@ -227,6 +228,7 @@ public class WebMvcAutoConfiguration { ...@@ -227,6 +228,7 @@ public class WebMvcAutoConfiguration {
} }
@Override @Override
@SuppressWarnings("deprecation")
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
WebMvcProperties.Contentnegotiation contentnegotiation = this.mvcProperties.getContentnegotiation(); WebMvcProperties.Contentnegotiation contentnegotiation = this.mvcProperties.getContentnegotiation();
configurer.favorPathExtension(contentnegotiation.isFavorPathExtension()); configurer.favorPathExtension(contentnegotiation.isFavorPathExtension());
......
/* /*
* Copyright 2012-2019 the original author or authors. * Copyright 2012-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -22,6 +22,7 @@ import java.util.Locale; ...@@ -22,6 +22,7 @@ import java.util.Locale;
import java.util.Map; import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.validation.DefaultMessageCodesResolver; import org.springframework.validation.DefaultMessageCodesResolver;
...@@ -352,10 +353,14 @@ public class WebMvcProperties { ...@@ -352,10 +353,14 @@ public class WebMvcProperties {
*/ */
private String parameterName; private String parameterName;
@DeprecatedConfigurationProperty(
reason = "Use of path extensions for request mapping and for content negotiation is discouraged.")
@Deprecated
public boolean isFavorPathExtension() { public boolean isFavorPathExtension() {
return this.favorPathExtension; return this.favorPathExtension;
} }
@Deprecated
public void setFavorPathExtension(boolean favorPathExtension) { public void setFavorPathExtension(boolean favorPathExtension) {
this.favorPathExtension = favorPathExtension; this.favorPathExtension = favorPathExtension;
} }
...@@ -402,18 +407,26 @@ public class WebMvcProperties { ...@@ -402,18 +407,26 @@ public class WebMvcProperties {
*/ */
private boolean useRegisteredSuffixPattern = false; private boolean useRegisteredSuffixPattern = false;
@DeprecatedConfigurationProperty(
reason = "Use of path extensions for request mapping and for content negotiation is discouraged.")
@Deprecated
public boolean isUseSuffixPattern() { public boolean isUseSuffixPattern() {
return this.useSuffixPattern; return this.useSuffixPattern;
} }
@Deprecated
public void setUseSuffixPattern(boolean useSuffixPattern) { public void setUseSuffixPattern(boolean useSuffixPattern) {
this.useSuffixPattern = useSuffixPattern; this.useSuffixPattern = useSuffixPattern;
} }
@DeprecatedConfigurationProperty(
reason = "Use of path extensions for request mapping and for content negotiation is discouraged.")
@Deprecated
public boolean isUseRegisteredSuffixPattern() { public boolean isUseRegisteredSuffixPattern() {
return this.useRegisteredSuffixPattern; return this.useRegisteredSuffixPattern;
} }
@Deprecated
public void setUseRegisteredSuffixPattern(boolean useRegisteredSuffixPattern) { public void setUseRegisteredSuffixPattern(boolean useRegisteredSuffixPattern) {
this.useRegisteredSuffixPattern = useRegisteredSuffixPattern; this.useRegisteredSuffixPattern = useRegisteredSuffixPattern;
} }
......
/* /*
* Copyright 2012-2019 the original author or authors. * Copyright 2012-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -432,6 +432,7 @@ class WebMvcAutoConfigurationTests { ...@@ -432,6 +432,7 @@ class WebMvcAutoConfigurationTests {
} }
@Test @Test
@Deprecated
void customMediaTypes() { void customMediaTypes() {
this.contextRunner.withPropertyValues("spring.mvc.contentnegotiation.media-types.yaml:text/yaml", this.contextRunner.withPropertyValues("spring.mvc.contentnegotiation.media-types.yaml:text/yaml",
"spring.mvc.contentnegotiation.favor-path-extension:true").run((context) -> { "spring.mvc.contentnegotiation.favor-path-extension:true").run((context) -> {
...@@ -687,6 +688,7 @@ class WebMvcAutoConfigurationTests { ...@@ -687,6 +688,7 @@ class WebMvcAutoConfigurationTests {
} }
@Test @Test
@Deprecated
void useSuffixPatternMatch() { void useSuffixPatternMatch() {
this.contextRunner.withPropertyValues("spring.mvc.pathmatch.use-suffix-pattern:true", this.contextRunner.withPropertyValues("spring.mvc.pathmatch.use-suffix-pattern:true",
"spring.mvc.pathmatch.use-registered-suffix-pattern:true").run((context) -> { "spring.mvc.pathmatch.use-registered-suffix-pattern:true").run((context) -> {
...@@ -707,6 +709,7 @@ class WebMvcAutoConfigurationTests { ...@@ -707,6 +709,7 @@ class WebMvcAutoConfigurationTests {
} }
@Test @Test
@Deprecated
void pathExtensionContentNegotiation() { void pathExtensionContentNegotiation() {
this.contextRunner.withPropertyValues("spring.mvc.contentnegotiation.favor-path-extension:true") this.contextRunner.withPropertyValues("spring.mvc.contentnegotiation.favor-path-extension:true")
.run((context) -> { .run((context) -> {
...@@ -718,6 +721,7 @@ class WebMvcAutoConfigurationTests { ...@@ -718,6 +721,7 @@ class WebMvcAutoConfigurationTests {
} }
@Test @Test
@Deprecated
void queryParameterContentNegotiation() { void queryParameterContentNegotiation() {
this.contextRunner.withPropertyValues("spring.mvc.contentnegotiation.favor-parameter:true").run((context) -> { this.contextRunner.withPropertyValues("spring.mvc.contentnegotiation.favor-parameter:true").run((context) -> {
RequestMappingHandlerMapping handlerMapping = context.getBean(RequestMappingHandlerMapping.class); RequestMappingHandlerMapping handlerMapping = context.getBean(RequestMappingHandlerMapping.class);
......
...@@ -2211,6 +2211,7 @@ Instead of using suffix matching, we can use a query parameter to ensure that re ...@@ -2211,6 +2211,7 @@ Instead of using suffix matching, we can use a query parameter to ensure that re
spring.mvc.contentnegotiation.media-types.markdown=text/markdown spring.mvc.contentnegotiation.media-types.markdown=text/markdown
---- ----
Suffix pattern matching is deprecated and will be removed in a future release.
If you understand the caveats and would still like your application to use suffix pattern matching, the following configuration is required: If you understand the caveats and would still like your application to use suffix pattern matching, the following configuration is required:
[source,properties,indent=0,subs="verbatim,quotes,attributes",configprops] [source,properties,indent=0,subs="verbatim,quotes,attributes",configprops]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment