gpt4 book ai didi

java - AbstractHealthIndicator 中的记录器对象为 null - Spring Boot

转载 作者:太空宇宙 更新时间:2023-11-04 09:34:17 25 4
gpt4 key购买 nike

当我在数据库关闭时调用 heathIndicator.health() 方法时,它会抛出 NullPointerException。堆栈跟踪显示 AbstractHealthIndicator 中的 logger 对象为 null。我也通过调试验证了这一点。当数据库启动时,代码可以正常工作,因为没有调用记录器。我不太明白为什么会发生这种情况。

这是Spring的AbstractHealthIndicatorhealth方法的代码

@Override
public final Health health() {
Health.Builder builder = new Health.Builder();
try {
doHealthCheck(builder);
}
catch (Exception ex) {
// null pointer exception happens here, logger is null.
if (this.logger.isWarnEnabled()) {
String message = this.healthCheckFailedMessage.apply(ex);
this.logger.warn(StringUtils.hasText(message) ? message : DEFAULT_MESSAGE,
ex);
}
builder.down(ex);
}
return builder.build();
}

最佳答案

我在 AbstractHealthIndicator 类中遇到了同样的问题。就我而言,问题是在我的健康指示器中使用 @Transactional 。由于这个注释,Spring 为我的类创建了一个 CGLIB 代理。这不应该是一个问题,但我猜因为 AbstractHealthIndicator 中的 AbstractHealthIndicator.health() 方法是最终的,CGLIB 代理无法正常工作。对此的明显解决方案不是使用 @Transactional 而是将检查委托(delegate)给服务。

这也在初始化期间指定。记录类似这样的内容:

 o.s.aop.framework.CglibAopProxy: Unable to proxy interface-implementing method [public final org.springframework.boot.actuate.health.Health org.springframework.boot.actuate.health.AbstractHealthIndicator.health()] because it is marked as final: Consider using interface-based JDK proxies instead!

关于java - AbstractHealthIndicator 中的记录器对象为 null - Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56698588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com