前因
在一个服务中,既定义了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
效果