Spring Boot不删除Actuator如何自定义开发/env端点?
Spring Boot 1.5.9 Actuator 自定义/env端点解决方案
核心实现思路
Spring Boot 1.5.x版本中Actuator端点以Bean形式注册到上下文,无需删除整套Actuator依赖即可覆盖或新增同名端点,两种稳定实现方案如下:
方案1:直接覆盖原生EnvEndpoint(推荐,无500报错风险)
无需手动禁用原生端点,通过@Primary注解让Spring优先加载你的自定义实现即可:
- 自定义类继承原生
EnvironmentEndpoint,重写invoke()方法实现自定义返回逻辑 - 类上添加
@Component+@Primary注解完成注册
示例代码:
import org.springframework.boot.actuate.endpoint.EnvironmentEndpoint; import org.springframework.context.annotation.Primary; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; @Component @Primary public class CustomEnvEndpoint extends EnvironmentEndpoint { public CustomEnvEndpoint(Environment environment) { super(environment); } @Override public Map<String, Object> invoke() { Map<String, Object> result = new HashMap<>(); // 自定义返回逻辑,若需要保留部分原生数据可先调用super.invoke()做过滤修改 result.put("code", 200); result.put("customEnvInfo", "你需要返回的自定义环境信息"); return result; } }
方案2:完全禁用原生端点后注册自定义同名端点
如果需要彻底关闭原生端点逻辑,可按以下步骤操作:
- 在
application.properties添加以下配置,避免禁用原生端点后返回500:# 禁用原生/env端点 endpoints.env.enabled=false # 关闭端点不存在时的异常抛出逻辑 management.security.enabled=false # 可根据实际安全规则调整 - 注册自定义端点,指定id为
env即可匹配/env访问路径:
import org.springframework.boot.actuate.endpoint.AbstractEndpoint; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; @Component public class CustomEnvEndpoint extends AbstractEndpoint<Map<String, Object>> { // 构造方法指定端点id为env,默认非敏感 public CustomEnvEndpoint() { super("env", false); } @Override public Map<String, Object> invoke() { Map<String, Object> result = new HashMap<>(); result.put("msg", "自定义/env端点响应"); return result; } }
注意:如果配置过
management.context-path参数,访问时需要在/env前加上配置的前缀路径。
原配置返回500的原因
仅设置endpoints.env.enabled=false时,Spring会尝试查找/env对应的端点处理器,找不到时会抛出未处理的端点不存在异常,默认没有对应异常的HTTP状态码映射,所以返回500而非404,上述两种方案都可以规避这个问题。
内容的提问来源于stack exchange,提问作者Jorge Garcia
相关产品推荐
相关产品推荐

