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

Posted

技术标签:

【中文标题】ApplicationInsights 破坏了静态内容的默认 Spring Boot 配置【英文标题】:ApplicationInsights breaks default Spring Boot configuration for static content 【发布时间】:2018-02-16 08:31:39 【问题描述】:

我有一个 Spring Boot Rest Web 服务。我还在 src/main/resources/static.swagger-ui 中添加了带有 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,因为映射到静态内容不再起作用。

知道如何解决吗?我可能可以手动添加映射器...

我的堆栈:

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

【问题讨论】:

【参考方案1】:

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

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

如果我们查看 applicationinsights.web 包,有一个名为 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 注释会破坏自动配置功能。

我没有重新编译没有这个注释的库,所以我不能 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);
    

【讨论】:

以上是关于ApplicationInsights 破坏了静态内容的默认 Spring Boot 配置的主要内容,如果未能解决你的问题,请参考以下文章

ApplicationInsights入门到精通系列

Vue Router 嵌套路径会在手动刷新时破坏静态资产路径

Microsoft-ApplicationInsights-AspNetCore 错误:EventSource 的命令处理中出现异常 Microsoft-ApplicationInsights-Asp

针对 C++ 静态破坏/构造顺序问题的特定于平台的解决方法

Zend Framework 1 应用程序中的缓存破坏静态资产

在 .csproj 文件中手动添加 Elmah 和 ApplicationInsights