1.Controller版本控制流程:
1.在controller类上添加@Version注解
2.使用swagger或者postman访问接口
2.实现代码
1.注解Version.class
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Version {
int value() default 1;
}
2.VersionRequestMappingHandlerMapping.class 该类的作用是将注解Version的版本值拼接在url前面,并注册到Mapping上
import java.lang.reflect.Method;
import java.util.Objects;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
public class VersionRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
@Nullable
@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
RequestMappingInfo info = super.getMappingForMethod(method, handlerType);
Version version = handlerType.getAnnotation(Version.class);
if (Objects.isNull(version)) {
return info;
}
String versionUrl = "/v" + version.value();
if (Objects.isNull(info)) {
return null;
}
return RequestMappingInfo.paths(versionUrl).build().combine(info);
}
}
3.VersionConfiguration.class 让spring容器启动时,创建RequestMappingHandlerMapping对象时,使用VersionRequestMappingHandlerMapping;加上资源拦截器addResourceHandlers,使swagger页面可以正常访问。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
@Configuration
public class VersionConfiguration extends WebMvcConfigurationSupport {
@Override
protected RequestMappingHandlerMapping createRequestMappingHandlerMapping() {
return new VersionRequestMappingHandlerMapping();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations(
"classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations(
"classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations(
"classpath:/META-INF/resources/webjars/");
super.addResourceHandlers(registry);
}
@Bean
protected RequestMappingHandlerMapping versionRequestMappingHandlerMapping() {
return new VersionRequestMappingHandlerMapping();
}
}
4.MenuV5Controller.class
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
@RequestMapping(value = "/vip")
@Api(tags = "菜单")
@Version(5)
public class MenuV5Controller {
@GetMapping(value = {"/menu"})
@ApiOperation("菜单接口")
public void menu() {
log.info("接口调用成功");
}
}
5.swagger展示
6.调用结果
扩展: 本文只实现了注解管理接口版本的场景,如果需要接口匹配,找不到V5默认找低版本的需求,那么需要读者网上找代码,网上demo较多,就不在此概述了;
QQ交流群: 132312549