我试图找到它,但我发现了许多不同的场景,但不是这个场景。
我想要做的是在com.myproject.api下的控制器中为所有路由添加“/ api /”前缀。 对于com.myapp.api包下的所有控制器,我想要“/ api / *”,com.myapp.web下的所有控制器都没有前缀
是否可以使用Spring / Spring Boot?
答案 0 :(得分:2)
使用 Spring Boot,这对我有用:
CMD + R
答案 1 :(得分:0)
在src / main / resources下添加application.properties
文件,使用以下选项:
server.contextPath=/api
查看common properties的官方参考。
答案 2 :(得分:0)
您应该将@RequestMapping("/api")
添加到每个所需的@Controller
或@RestController
类的顶部。
当类和方法都有该注释时,Spring Boot会在构建url时附加它们。在下面的示例中,该方法将绑定到/api/user
route。
@RequestMapping("/api")
@RestController
public class MyController {
@RequestMapping("/user")
public List<User> getUsers(){
return ...
}
}
答案 3 :(得分:0)
如果您使用的是springboot,可以添加以下内容:
server.servlet.context-path=/api
到application.properties文件。
答案 4 :(得分:0)
只要您使用的是MVC,我就可以通过以下方式达到您期望的结果。
首先创建一个实现WebMvcRegistrations
@Configuration
public class WebMvcConfig implements WebMvcRegistrations {
@Value("${Prop.Value.String}") //"api"
private String apiPrefix;
@Value("${Prop.Package.Names}") //["com.myapp.api","Others if you like"]
private String[] prefixedPackages;
@Override
public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
return new PrefixedApiRequestHandler(apiPrefix,prefixedPackages);
}
}
然后创建一个扩展RequestMappingHandlerMapping
的类
并覆盖getMappingForMethod
@Log4j2
public class PrefixedApiRequestHandler extends RequestMappingHandlerMapping {
private final String prefix;
private final String[] prefixedPackages;
public PrefixedApiRequestHandler(final String prefix, final String... packages) {
super();
this.prefix = prefix;
this.prefixedPackages = packages.clone();
}
@Override
protected RequestMappingInfo getMappingForMethod(final Method method, final Class<?> handlerType) {
RequestMappingInfo info = super.getMappingForMethod(method, handlerType);
if (info == null) {
return null;
}
for (final String packageRef : prefixedPackages) {
if (handlerType.getPackageName().contains(packageRef)) {
info = createPrefixedApi().combine(info);
log.trace("Updated Prefixed Mapping " + info);
return info;
}
}
log.trace("Skipped Non-Prefixed Mapping " + info);
return info;
}
private RequestMappingInfo createPrefixedApi() {
String[] patterns = new String[prefix.length()];
for (int i = 0; i < patterns.length; i++) {
// Build the URL prefix
patterns[i] = prefix;
}
return new RequestMappingInfo(
new PatternsRequestCondition(patterns,
getUrlPathHelper(),
getPathMatcher(),
useSuffixPatternMatch(),
useTrailingSlashMatch(),
getFileExtensions()),
new RequestMethodsRequestCondition(),
new ParamsRequestCondition(),
new HeadersRequestCondition(),
new ConsumesRequestCondition(),
new ProducesRequestCondition(),
null);
}
}
然后您应该只在指定的程序包中看到/ api /(ControllerMapping)的所有映射。注意:我的控制器顶部有@RequestMapping("/")
。