如何在com.myproject.api下为所有控制器添加“api”前缀?

时间:2017-03-11 08:10:27

标签: java spring spring-mvc spring-boot spring-webflow

我试图找到它,但我发现了许多不同的场景,但不是这个场景。

我想要做的是在com.myproject.api下的控制器中为所有路由添加“/ api /”前缀。 对于com.myapp.api包下的所有控制器,我想要“/ api / *”,com.myapp.web下的所有控制器都没有前缀

是否可以使用Spring / Spring Boot?

5 个答案:

答案 0 :(得分:2)

使用 Spring Boot,这对我有用:

CMD + R

答案 1 :(得分:0)

已经回答herehere

在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("/")