首页 > 解决方案 > Spring Boot Admin 应用程序 - 使用 InstanceExchangeFilterFunction 将蛇形大小写转换为 UI 的驼峰形大小写

问题描述

我有一个使用蛇案例命名策略(自定义 ObjectMapper)的客户端 api。一切都已正确设置并且运行良好,但当然 SBA(2.3.1 版)UI 的某些内容无法正常工作(指标、环境...)。我尝试实现 InstanceExchangeFilterFunction 以将蛇形大小写转换为 UI 的骆驼形大小写,但没有成功。如果有人可以提供如何正确执行此操作的示例,我将不胜感激。如果我理解正确,我想拦截客户端请求,并将其处理为驼峰式,我不知道该怎么做。谢谢


    ...
    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.sba</groupId>
    <artifactId>SpringBootAdmin</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBootAdmin</name>
    <description>SpringBootAdmin</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot-admin.version>2.3.1</spring-boot-admin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        ...

@Import({SecurityConfig.class})
@Configuration
@EnableAdminServer
@SpringBootApplication
public class SpringBootAdminApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootAdminApplication.class, args);
    }
}


@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Bean
    public InstanceExchangeFilterFunction caseStrategy(List<HttpMessageConverter<?>> converters) {

        for(HttpMessageConverter<?> converter : converters) {
            if(converter instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter jsonMessageConverter = (MappingJackson2HttpMessageConverter) converter;
                ObjectMapper objectMapper = jsonMessageConverter.getObjectMapper();
                ((MappingJackson2HttpMessageConverter) converter).setObjectMapper(objectMapper);

            }
        }
        return (instance, request, next) -> next.exchange(request);
    }
}

我也试过这段代码,它解析了 SBA UI,但前端应用程序不起作用。

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
   for (HttpMessageConverter<?> converter : converters) {
       if (converter instanceof MappingJackson2HttpMessageConverter) {
           MappingJackson2HttpMessageConverter jsonMessageConverter = (MappingJackson2HttpMessageConverter) converter;
           ObjectMapper objectMapper = jsonMessageConverter.getObjectMapper();
           objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

            }}
    }

标签: javacamelcasingspring-boot-adminfilterfunctionsnakecasing

解决方案


或多或少,以下 GitHub 问题使用用于所有端点的全局 JSON 转换器和用于响应匹配的执行器端点的执行器 JSON 转换器解决了这个问题Content-Type,例如application/vnd.spring-boot.actuator.v3+json. 您在客户端应用程序中指定这两个 bean。

https://github.com/codecentric/spring-boot-admin/issues/751#issuecomment-575999785

请注意,在 Spring Boot 2.5.0 之后ActuatorMediaTypeApiVersion.


推荐阅读