如何为所有控制器配置默认的@RestController URI前缀?

pcz*_*eus 12 java groovy spring-mvc spring-boot

我知道你可以设置server.contextPathin application.properties来改变根上下文.

另外,我可以在Spring Boot的应用程序配置中添加一个额外的上下文,如下例(在Groovy中),为根上下文的URL映射添加"/ api":

@Bean
ServletRegistrationBean dispatcherServlet() {
     ServletRegistrationBean reg = new ServletRegistrationBean(new DispatcherServlet(), "/")
        reg.name = "dispatcherServlet"
        reg.addInitParameter("contextConfigLocation", "")
        reg.addUrlMappings("/api/*")
        reg.loadOnStartup = 2
        reg
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试为Web服务调用提供一个单独的基本URI"/ api",我可以利用它来保证安全性等.但是使用上述方法将意味着可以通过以下方式访问我的任何URI,无论是否使用Web服务"/"或"/ api",并没有提供具体的隔离.

是否有人知道@RestController使用配置为所有(s)设置基本路径的更好方法,而不必使用/ api /正式为每个控制器添加前缀?如果我被迫手动为每个控制器的URI添加前缀,则可能会错误地省略它并绕过我特定于Web服务的安全措施.

这是Stack Overflow中对同一类型问题的引用,该问题从未得到完全回答:

Spring Boot:为RestControllers配置url前缀

Heg*_*kar 21

继续当前接受的解决方案,github 问题解决了相同的问题

Spring 5.1 及更高版本您可以实现WebMvcConfigurer和覆盖configurePathMatch如下所示的方法

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.addPathPrefix("/api",
                    HandlerTypePredicate.forAnnotation(RestController.class));
    }

}
Run Code Online (Sandbox Code Playgroud)

现在所有的@RestControllers都将/api作为前缀路径与配置的路径一起使用。

官方文档


mh-*_*dev 14

自Spring Boot 1.4.0.RC1以来,有一种解决此类问题的新解决方案(详见https://github.com/spring-projects/spring-boot/issues/5004)

Shahin ASkari的解决方案禁用部分Auto配置,因此可能会导致其他问题.

以下解决方案采用了他的想法并将其正确地集成到弹簧引导中.对于我的情况,我希望所有RestControllers都具有基本路径api,但仍然使用根路径提供静态内容(fe angular webapp)

编辑:我在博客文章中总结了一些略有改进的版本,请参阅https://mhdevelopment.wordpress.com/2016/10/03/spring-restcontroller-specific-basepath/

@Configuration
public class WebConfig {

    @Bean
    public WebMvcRegistrationsAdapter webMvcRegistrationsHandlerMapping() {
        return new WebMvcRegistrationsAdapter() {
            @Override
            public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
                return new RequestMappingHandlerMapping() {
                    private final static String API_BASE_PATH = "api";

                    @Override
                    protected void registerHandlerMethod(Object handler, Method method, RequestMappingInfo mapping) {
                        Class<?> beanType = method.getDeclaringClass();
                        RestController restApiController = beanType.getAnnotation(RestController.class);
                        if (restApiController != null) {
                            PatternsRequestCondition apiPattern = new PatternsRequestCondition(API_BASE_PATH)
                                    .combine(mapping.getPatternsCondition());

                            mapping = new RequestMappingInfo(mapping.getName(), apiPattern,
                                    mapping.getMethodsCondition(), mapping.getParamsCondition(),
                                    mapping.getHeadersCondition(), mapping.getConsumesCondition(),
                                    mapping.getProducesCondition(), mapping.getCustomCondition());
                        }

                        super.registerHandlerMethod(handler, method, mapping);
                    }
                };
            }
        };
    }

}
Run Code Online (Sandbox Code Playgroud)


Nik*_*nko 10

您也可以通过像这样配置 WebMVC 来获得相同的结果:

@Configuration
public class PluginConfig implements WebMvcConfigurer {

public static final String PREFIX = "/myprefix";

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer.addPathPrefix(PREFIX, c -> c.isAnnotationPresent(MyCustomAnnotation.class));
}
Run Code Online (Sandbox Code Playgroud)

}

  1. WebMvcConfigurer在任何@Configuration类上实现。
  2. 覆盖configurePathMatch方法。
  3. 你可以做很多有用的事情,PathMatchConfigurer例如为几个满足谓词条件的类添加前缀。


Oli*_*hti 2

有人在 Spring MVC Jira 中提出了一个问题,并提出了一个很好的解决方案,我现在正在使用它。这个想法是在每个 RestController 文件中放置的前缀中使用 Spring 表达式语言,并引用 Spring Boot application.properties 文件中的单个属性。

这是问题的链接:https ://jira.spring.io/browse/SPR-13882