没有预设 Content-Type 'null' 的 [class org.springframework.boot.actuate.health.SystemHealth] 转换器

问题描述 投票:0回答:1

我面临以下问题..当我开始点击 http://localhost:8080/actuator/health url 时。 我可以知道有人遇到过同样的问题吗?我无法弄清楚这个问题。

错误 o.a.c.c.C.[.[.[.[dispatcherServlet].log - 路径 [] 上下文中 servlet [dispatcherServlet] 的 Servlet.service() 引发异常 [请求处理失败;嵌套异常是 org.springframework.http.converter.HttpMessageNotWritableException:没有带有预设 Content-Type 'null'] 的 [class org.springframework.boot.actuate.health.SystemHealth] 转换器,根本原因 org.springframework.http.converter.HttpMessageNotWritableException:没有预设 Content-Type 'null' 的 [class org.springframework.boot.actuate.health.SystemHealth] 转换器

spring-boot-actuator
1个回答
0
投票

当我使用 Spring Boot 3.2.0 创建特定的单元测试类时,我遇到了同样的问题。

您可以在此处看到您附近的问题,并显示相同的错误消息。在这种情况下,这是由 Jackson 格式引起的

就我而言,问题与缺少 WebMvcAutoConfiguration 类 - Spring Boot 有关,它带来了转换器。如果您在单元测试类上方使用@SpringBootTest注释,它会自动带来。但就我而言 - 当我决定创建一个单元测试类,重点是根据 application.yaml 中声明的每个端点仅检查 Spring Boot Actuator 配置时,问题就出现了。单元测试类的目标是避免更新或回归期间意外的错误配置以及不规则地公开端点。我创建的单元测试类是为了避免通过@SpringBootApplication加载所有ApplicationContext继承,它加载所有Spring Boot可用的自动配置

package br.com.test.controller;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.availability.AvailabilityHealthContributorAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.availability.AvailabilityProbesAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.info.InfoEndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration;
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration;
import org.springframework.boot.actuate.health.PingHealthIndicator;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.boot.availability.ApplicationAvailabilityBean;
import org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;

/**
 * Unit test specialized on to check Spring Boot Actuator configurations at the artifact.
 * We configure to expose only some endpoints, for example, /health, if any configuration has changed, then it'll
 * check the regression.
 */
@SpringBootTest(
        classes = HealthCheckControllerTest.CustomApplicationContext.class,
        properties = {
                "management.endpoint.health.group.liveness.include=livenessState",
                "management.endpoint.health.group.readiness.include=readinessState"})
class HealthCheckControllerTest {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mockMvc;

    @BeforeEach
    public void setUp() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
    }

    @Test
    void requisitaEndpointHealth_ViaGet_deveRetornar200ComServicoUP()
            throws Exception {
        this.mockMvc.perform(MockMvcRequestBuilders.get("/health"))
                .andDo(print())
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(jsonPath("$.status").value("UP"));
    }

    @Test
    void requisitaEndpointHealthLiveness_ViaGet_deveRetornar200ComServicoUP()
            throws Exception {
        this.mockMvc.perform(MockMvcRequestBuilders.get("/health/liveness"))
                .andDo(print())
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(jsonPath("$.status").value("UP"));
    }

    @Test
    void requisitaEndpointHealthReadiness_ViaGet_deveRetornar200ComServicoUP()
            throws Exception {
        this.mockMvc.perform(MockMvcRequestBuilders.get("/health/readiness"))
                .andDo(print())
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(jsonPath("$.status").value("UP"));
    }

    /**
     * That class allows to turn available only some Spring Boot Actuator Auto-configurations.
     *
     * By default, @SpringBootApplication loads all resources unnecessarily declared as spring boot dependencies
     * (starters).
     *
     * <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.auto-configuration">...</a>
     *
     */
    @Configuration
    @ManagementContextConfiguration
    @Import({
            EndpointAutoConfiguration.class,
            HealthEndpointAutoConfiguration.class,
            InfoEndpointAutoConfiguration.class,
            WebEndpointAutoConfiguration.class,
            ManagementContextAutoConfiguration.class,
            HealthCheckControllerTest.class,
            AvailabilityHealthContributorAutoConfiguration.class,
            AvailabilityProbesAutoConfiguration.class,
            PingHealthIndicator.class,
            ApplicationAvailabilityBean.class,
            MockMvcAutoConfiguration.class,
            WebMvcAutoConfiguration.class // I included it manually and solved
    })
    public class CustomApplicationContext {

    }

}

希望您能解决您的问题。谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.