1. springboot4 支持版本控制
没有配置版本策略时,启动报错.
@RestController
public class VersionController {
@Autowired
private User user;
@Autowired
private Article article;
@Value("${dynamic.property:default}")
private String dynamicProperty;
@GetMapping(value = "/test", version = "1.0")
public String getVersion1() {
System.out.println(article);
System.out.println(user);
return String.format("1.0.0 config: %s", dynamicProperty) ;
}
@GetMapping(value = "/test", version = "2.0")
public String getVersion2() {
return "2.0.0";
}
@GetMapping(value = "/test/{version}")
public String getVersion3(@PathVariable("version") String version) {
return "3.0.0";
}
}
2. 报错信息如下:
Caused by: java.lang.IllegalStateException: Invalid mapping on handler class [com.nextera.boot4.controller.VersionController]: public java.lang.String com.nextera.boot4.controller.VersionController.getVersion1()
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lambda$detectHandlerMethods$0(AbstractHandlerMethodMapping.java:283) ~[spring-webmvc-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.core.MethodIntrospector.lambda$selectMethods$0(MethodIntrospector.java:76) ~[spring-core-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:366) ~[spring-core-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.core.MethodIntrospector.selectMethods(MethodIntrospector.java:74) ~[spring-core-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:276) ~[spring-webmvc-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.processCandidateBean(AbstractHandlerMethodMapping.java:261) ~[spring-webmvc-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:220) ~[spring-webmvc-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:208) ~[spring-webmvc-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:176) ~[spring-webmvc-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1860) ~[spring-beans-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1809) ~[spring-beans-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
... 21 common frames omitted
Caused by: java.lang.IllegalStateException: API version specified, but no ApiVersionStrategy configured
at org.springframework.util.Assert.state(Assert.java:80) ~[spring-core-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.web.servlet.mvc.method.RequestMappingInfo$DefaultBuilder.build(RequestMappingInfo.java:773) ~[spring-webmvc-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.createRequestMappingInfo(RequestMappingHandlerMapping.java:375) ~[spring-webmvc-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.createRequestMappingInfo(RequestMappingHandlerMapping.java:279) ~[spring-webmvc-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getMappingForMethod(RequestMappingHandlerMapping.java:229) ~[spring-webmvc-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getMappingForMethod(RequestMappingHandlerMapping.java:79) ~[spring-webmvc-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lambda$detectHandlerMethods$0(AbstractHandlerMethodMapping.java:279) ~[spring-webmvc-7.0.0-SNAPSHOT.jar:7.0.0-SNAPSHOT]
... 31 common frames omitted
3、解决方法:
@Configuration
public class VersionConfig implements WebMvcConfigurer {
@Override
public void configureApiVersioning(ApiVersionConfigurer configurer) {
configurer.useRequestParam("version");
configurer.useRequestHeader("version");
configurer.useRequestHeader("X-Version");
//Add resolver to extract the version from a path segment.
//Params:
//index – the index of the path segment to check;
// e.g. for URL's like "/{version}/..." use index 0, for "/api/{version}/..." index 1.
configurer.usePathSegment(1);
}
}
4、配置好后, 支持一下形式访问不同api版本信息:
- http://localhost:8080/test/1
- http://localhost:8080/api/test?version=1
- curl http://localhost:8080/test -H "version: 1"