当前位置: 首页 > 知识库问答 >
问题:

Spring防尘套2执行器,无Spring防尘套且@启用自动配置

轩辕啸
2023-03-14

我正在尝试使用现有的Gradle Spring MVC项目设置Spring执行器。我无法使用@EnableAutoConfiguration。不幸的是,我无法到达执行器endpoint,我想我遗漏了一些东西。

项目中的Spring依赖项包括:

// springVersion = 5.1.+
implementation(
            "org.springframework:spring-beans:$springVersion",
            "org.springframework:spring-webmvc:$springVersion",
            "org.springframework:spring-jdbc:$springVersion")

implementation 'org.springframework.boot:spring-boot-starter-actuator'

我正在尝试使用以下内容配置project:

@Configuration
@Import({EndpointAutoConfiguration.class,
        MetricsEndpointAutoConfiguration.class,
        HealthEndpointAutoConfiguration.class,
        MappingsEndpointAutoConfiguration.class,
        InfoEndpointAutoConfiguration.class})
@EnableWebMvc
public class DI_App {

}

在属性文件中,我添加了:

management.endpoints.web.exposure.include=*

没有启用执行器endpoint,当尝试访问它们时,我得到404。我经历了许多相关问题,但没有一个解决方案对我有用。

我可能需要定义自定义的endpoint处理映射(EndpointHandlerMapping),但不确定如何执行,它似乎不可用。(参考号:https://stackoverflow.com/a/53010693)

@Configuration
@EnableWebMvc
@ComponentScan("com.test.springtest")
@Import({
        ConfigurationPropertiesReportEndpointAutoConfiguration.class,
        EndpointAutoConfiguration.class,
        WebEndpointAutoConfiguration.class,
        HealthEndpointAutoConfiguration.class,
        HealthIndicatorAutoConfiguration.class,
        InfoEndpointAutoConfiguration.class,
        InfoContributorAutoConfiguration.class,
        LogFileWebEndpointAutoConfiguration.class,
        LoggersEndpointAutoConfiguration.class,
        WebMvcMetricsAutoConfiguration.class,
        ManagementWebSecurityAutoConfiguration.class,
        ManagementContextAutoConfiguration.class,
        ServletManagementContextAutoConfiguration.class
})
public class DI_App {
    private final ApplicationContext _applicationContext;

    DI_App(ApplicationContext applicationContext) {
        _applicationContext = applicationContext;
        System.setProperty("management.endpoints.web.exposure.include", "*");
        System.setProperty("management.endpoints.jmx.exposure.exclude", "*");
        System.setProperty("management.endpoints.web.base-path", "/manage");
        System.setProperty("management.server.port", "10100");
    }

    @Bean
    public WebMvcEndpointHandlerMapping endpointHandlerMapping(Collection<ExposableWebEndpoint> endpoints) {
        List<String> mediaTypes = List.of(MediaType.APPLICATION_JSON_VALUE, ActuatorMediaType.V2_JSON);
        EndpointMediaTypes endpointMediaTypes = new EndpointMediaTypes(mediaTypes, mediaTypes);
        WebEndpointDiscoverer discoverer = new WebEndpointDiscoverer(_applicationContext,
                new ConversionServiceParameterValueMapper(),
                endpointMediaTypes,
                List.of(EndpointId::toString),
                emptyList(),
                emptyList());

        return new WebMvcEndpointHandlerMapping(new EndpointMapping("/manage"),
                endpoints,
                endpointMediaTypes,
                new CorsConfiguration(),
                new EndpointLinksResolver(discoverer.getEndpoints()));
    }
}

我必须添加dispatcherServlet bean,以便能够添加ManagementContextAutoConfiguration。类导入:

@Component
public class AppDispatcherServlet implements DispatcherServletPath {
    @Override
    public String getPath() {
        return "/";
    }
}

当前状态是,当转到管理endpoint时,我得到以下信息:

{"_links":{"self":{"href":"http://localhost:10100/dev/manage","templated":false},"info":{"href":"http://localhost:10100/dev/manage/info","templated":false}}}

但是http://localhost:10100/dev/manage/info返回404并且没有其他可用的endpoint。

共有1个答案

燕飞文
2023-03-14

我使用的是Maven,而不是Gradle,但情况类似。我有一个工作Spring启动执行器1.4.2。使用Spring MVC 4.3.21释放健康执行器endpoint。升级到spring boot starter actuator 2.6.1和spring MVC 5.3.13,以下内容可帮助我达到/myAppContext/health。

DispatcherServletAutoConfiguration导入可能能够替换您的显式DispatcherServlet bean。我的案例不包括Info执行器endpoint,但对我来说,关键是下面的特定导入。订单对于某些导入有些重要,至少在我的测试中是这样。

我对Spring启动知之甚少,所以这是启用自动配置、倒出Spring启动TRACE日志输出以及尝试大量不同导入组合的结果。

@Configuration
@EnableWebMvc
@Import({
        DispatcherServletAutoConfiguration.class,
        WebMvcAutoConfiguration.class,
        WebEndpointAutoConfiguration.class,
        EndpointAutoConfiguration.class,
        HealthEndpointAutoConfiguration.class,
        WebMvcEndpointManagementContextConfiguration.class
})

@PropertySource("classpath:/health.properties")
public class MyAppActuatorConfig {
    // 1.x version had EndpointHandlerMapping and HealthMvcEndpoint beans here.
    // There may be a more spring-boot-ish way to get this done : )
}

以及适合我的部署细节的最小health.properties,其中安全性已经到位:

management.endpoints.web.base-path=/

management.endpoint.health.show-details=when-authorized
management.endpoint.health.show-components=when-authorized
 类似资料:
  • 我目前正在尝试编写一个Spring Boot启动器,它将使用API网关自动验证我们的微服务,并在所有传出请求(针对网关)的标头中包含访问令牌。 我正在创建一个RestTemboard bean并为其提供我们的自定义拦截器,但我的问题是,通过这样做,我阻止其他团队(将使用此启动器)使用他们自己的RestTemboard配置,因为他们必须定义导致多个bean存在的相同bean。 是否有其他方法可以拦截

  • 我想将Spring启动执行器添加到我的应用程序,但当我添加此依赖项时 我得到以下错误 java.lang.reflect.InvocationTargetException at_NativeMethodAccessorImpl.invoke0(Native Method)at(...)由以下原因引起:org.springframework.beans.factory.不满意DependencyE

  • 我使用的是spring boot 2.0.0。M3带Spring防尘套启动器执行器。我启用了两项健康检查: healt check bean由自动配置创建,但不是由创建。的响应是404。 我做错了什么? 提前感谢 编辑: Mhm致动器项目是否与反应式和webflux一起工作?Ok发现了这个问题:https://github.com/spring-projects/spring-boot/issue

  • 我正在尝试使用spring boot和hibernate。当我使用存储库时,它工作得很好,但我正在尝试使用Hibernate会话来创建DAO,而这个DAO不是事务的一部分。 这是测试代码: 应用Java语言 UserBusinessImpl。java: 用户存储库。Java语言 用户DAO: 当我尝试getCurrentSession()时,它抛出了一个错误。openSession()与我的事务分

  • 我使用了不同端口的Spring启动执行器,如下所示 在应用程序中,我想在执行器端口中使用启用csrf=true,但我不想使用csrf。因为我想对jolokia使用批量POST请求。 只排除并不聪明。 下面的属性对我很好(bt管理。安全。启用csrf不存在)。 有什么好的解决办法吗?

  • 我试图通过遵循这里的教程,使用Spring boot在Java中创建一个RESTful应用程序。我想修改它,以便可以从URL中提取标识符,并使用它来服务请求。 所以