ApplicationInsights打破静态内容的默认Spring Boot配置

时间:2017-09-07 14:36:54

标签: spring-mvc spring-boot azure-application-insights

我有一个Spring Boot Rest Web服务。我还将swagger-ui的静态内容添加到src / main / resources / static.swagger-ui中,以便我可以访问我的文档。

默认情况下,SimpleUrlHandlerMapping会在启动时自动将我的请求映射到静态内容。

...
2017-09-07 15:41:21.144  INFO 6912 --- [localhost-startStop-1] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-09-07 15:41:21.144  INFO 6912 --- [localhost-startStop-1] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-09-07 15:41:21.212  INFO 6912 --- [localhost-startStop-1] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
...

我在gradle文件中添加了对Application Insights的引用

... part of my gradle file
// Application Insight related jar - required for telemetrics and loggers
compile("com.microsoft.azure:applicationinsights-web:${aiWeb}")
compile("com.microsoft.azure:applicationinsights-logging-logback:${aiLogback}")
...

这在某种程度上打破了SimpleUrlHandlerMapping,因为映射到静态内容不再起作用。

知道怎么解决吗?我可以手动添加mapper ...

我的筹码:

  • springBootVersion = 1.5.3.RELEASE
  • springSecurityVersion = 4.2.1.RELEASE
  • aiWeb = 1.0.9 aiLogback = 1.0.6

1 个答案:

答案 0 :(得分:0)

经过一整天的调试后,我认为我找到了一个根本原因(肯定是解决方法)

根据Spring Boot的documentation,它自动配置Spring MVC。这涉及静态内容的配置。

如果我们看一下 applicationinsights.web pacakge,就会有一个名为InterceptorRegistry的类

package com.microsoft.applicationinsights.web.spring.internal;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.microsoft.applicationinsights.web.spring.RequestNameHandlerInterceptorAdapter;

/**
 * This class registers the RequestNameHandlerInterceptorAdapter to the interceptors registry.
 * The registration enables the interceptor to extract the http request's controller and action names.
 */
@EnableWebMvc
@Configuration
public class InterceptorRegistry extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(org.springframework.web.servlet.config.annotation.InterceptorRegistry registry) {
        registry.addInterceptor(new RequestNameHandlerInterceptorAdapter());
    }
}

这就是文档所说的:

  

如果你想保留Spring Boot MVC功能,你只想添加   额外的MVC配置(拦截器,格式化器,视图   控制器等)您可以添加自己的@Configuration类类型   WebMvcConfigurerAdapter,但没有 @EnableWebMvc

所以看起来包中有一个错误,因为类包含 @EnableWebMvc 注释会破坏自动配置功能。<​​/ p>

如果没有此注释,我没有重新编译该库,因此我不能100%确定删除此标记是否可以解决此问题。我所做的是手动添加映射。

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
                .addResourceHandler("/swagger-ui/**")
                .addResourceLocations("classpath:/static/swagger-ui/");
        super.addResourceHandlers(registry);
    }
}