前因
在一个服务中,既定义了app端接口,又定义了pc端接口,为了方便区分,可以在项目里建立一个名为"app"、"pc"的文件夹,分别为app、pc提供接口。当app和pc接口一致时,写完一端接口后,可以直接拷贝到另一文件夹,直接使用。但当不加前缀的情况下,因接口定义一致,会出现异常。这时候在接口前添加前缀,就可以解决这个问题。
实现步骤
-
定义一个配置类,实现WebMvcConfigurer,重写configurePathMatch方法,指定添加前缀
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@AutoConfiguration
public class MyWebAutoConfiguration implements WebMvcConfigurer {
public void configurePathMatch(PathMatchConfigurer configurer) {
AntPathMatcher antPathMatcher = new AntPathMatcher(".");
configurer.addPathPrefix("/app-api", (clazz) -> {
return clazz.isAnnotationPresent(RestController.class) && antPathMatcher.match(".example.my_2024_demo.ctrl.app.", clazz.getPackage().getName());
});
configurer.addPathPrefix("/pc-api", (clazz) -> {
return clazz.isAnnotationPresent(RestController.class) && antPathMatcher.match(".example.my_2024_demo.ctrl.pc.", clazz.getPackage().getName());
});
}
} -
ctrl 接口定义文件目录如下图,与上一步指定路径相对应
代码import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class AppTestCtrl {@GetMapping("/test") private String test(HttpServletRequest request) { request.setAttribute("name", "用于测试信息"); return "app test"; }
}
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class PcTestCtrl {@GetMapping("/test") private String test(HttpServletRequest request) { request.setAttribute("name", "用于测试信息"); return "pc test"; }
}
-
接口访问
pc端:http://localhost:8080/pc-api/test
效果
app端:http://localhost:8080/app-api/test
效果