【问题标题】:Custom endpoint in Spring Boot ActuatorSpring Boot Actuator 中的自定义端点
【发布时间】:2015-08-30 07:50:12
【问题描述】:

我正在尝试为 Spring Boot 应用程序编写自定义端点。我已经编写了如下的自定义端点实现。我没有包含额外的东西,比如 import 以减少代码的大小。

@Component
public class TestendPoint implements Endpoint<List<String>>{

    public String getId() {
        return "test";      
    }

    public List<String> invoke() {
        List<String> test= new ArrayList<String>();
        test.add("Details 1");
        test.add("Details 2");
        return serverDetails;
    }

    public boolean isEnabled() {        
        return true;
    }

    public boolean isSensitive() {      
        return false;
    }

}

写完上述代码后,我重新启动了应用程序并尝试从 /test 访问端点。但是,端点不可用。下面是Spring Boot启动应用。

@Configuration
@EnableAutoConfiguration
public class Application{

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

除此之外,我拥有运行 Spring Boot Actuator 的一切。我可以访问默认端点,例如 /info、/metrics 等。

如果我在这里遗漏了什么,你能分享你的知识吗?我假设自定义端点类将在没有开发人员进一步配置的情况下加载。

【问题讨论】:

  • 我是否应该在 Spring Boot 应用程序类中包含 @ComponentScan。如果我添加,那么我会遇到异常

标签: spring-boot spring-boot-actuator


【解决方案1】:

我已经解决了这个问题。首先,我没有在应用程序类中包含@ComponentScan 注解。或者我应该有@SpringBoot 应用程序。当我添加注释时,我开始收到以下异常:

Caused by: java.lang.IllegalStateException: Could not evaluate condition owing to internal class not found. This can happen if you are @ComponentScanning a springframework package (e.g. if you put a @ComponentScan in the default package by mistake)
    at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:50)
    at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:92)
    at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:79)
    at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:62)
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.isConditionMatch(ClassPathScanningCandidateComponentProvider.java:361)
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.isCandidateComponent(ClassPathScanningCandidateComponentProvider.java:345)
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:278)
    ... 18 more
Caused by: java.lang.NoClassDefFoundError: org/springframework/dao/DataAccessException
    at org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$EmbeddedDatabaseCondition.getMatchOutcome(DataSourceAutoConfiguration.java:308)
    at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:129)
    at org.springframework.boot.autoconfigure.condition.SpringBootCondition.anyMatches(SpringBootCondition.java:112)
    at org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$DatabaseCondition.getMatchOutcome(DataSourceAutoConfiguration.java:333)
    at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:44)
    ... 24 more

这是由于包裹。我试过从根包执行主类。我不确定这是否是 Spring Boot 应用程序中的错误,我会在他们的网站上记录一个 JIRA。一旦我添加了一层包结构,它就开始正常工作了。

【讨论】:

  • 不,这不是错误。当您将 Spring Boot 应用程序放在根包中时,您会看到一个胖警告日志,它应该让您知道某些东西可能会中断。见the doc
  • 感谢您的澄清。
  • 但我没有使用默认包来获取该异常。我使用根包进行组件扫描
  • 你的问题看起来完全是like this issue
  • 我创建了新问题 #3850
猜你喜欢
  • 2021-04-24
  • 2015-02-22
  • 2023-03-10
  • 2020-06-01
  • 2016-06-01
  • 1970-01-01
  • 2017-01-21
  • 2020-09-15
  • 2016-05-02
相关资源
最近更新 更多