【问题标题】:How to deserialize Spring Boot actuator environment如何反序列化 Spring Boot 执行器环境
【发布时间】:2018-08-08 10:17:31
【问题描述】:

我想反序列化返回的 Spring Boot Environment 对象:

http://hostname:port/actuator/env

我正在使用杰克逊的ObjectMapper

private static final ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
...
ClientResponse clientResponse = resource.type(MediaType.APPLICATION_JSON).get(ClientResponse.class);
InputStream is = clientResponse.getEntityInputStream();

org.springframework.core.env.Environment e = mapper.readValue(is, org.springframework.core.env.Environment.class);

上面的代码失败并出现以下错误,这是有道理的:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of org.springframework.core.env.Environment, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information

但是我已经尝试了Environment 类的所有实现(AbstractEnvironmentMockEnvironmentStandardEnvironmentStandardServletEnvironment),它们也都失败了。

我应该使用哪个类?

【问题讨论】:

  • 这不是环境对象,而是 Spring Boot 所称环境的表示。试图将其反序列化为 Environment 类之一根本行不通。
  • 这很有趣。所以我基本上是在浪费时间。
  • Environment 是一个很重的自定义对象,尤其是内部的PropertySource 实例。你不能简单地反序列化它们。

标签: java spring-boot jackson spring-boot-actuator


【解决方案1】:

org.springframework.core.env.Environment 是一个接口。所以ObjectMapper 无法猜测要实例化什么具体类。你需要告诉你的ObjectMapper 使用哪个类。所以在你的行中 org.springframework.core.env.Environment e = mapper.readValue(is,org.springframework.core.env.Environment.class); 你需要用一些具体的类替换org.springframework.core.env.Environment.class。例如org.springframework.core.env.StandardEnvironment(取决于实际返回的环境类型)。否则将其反序列化为映射:

Map<String, Object> map = mapper.readValue(is,HashMap<String, Object>.class);

然后从那里出发

【讨论】:

  • 谢谢你们。我没有我要检查的服务的源代码,所以我不知道返回什么样的环境。查看 json 我猜想 StandardServletEnvironment: {"activeProfiles":["aaaaa","bbbbbbbbbbb"],"propertySources":[{"name":"server.ports","properties":{"local.server .port":{"value":50053}}},{"name":"servletContextInitParams","properties":{}},{"name":"systemProperties","properties":{"java.runtime. name":{"value":"Java(TM) SE Runtime... 无论如何,无论我使用 StandardServletEnvironment 还是 StandardEnvironment 我都会得到同样的错误:
  • 无法从 [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@67f9fca4; 的 START_ARRAY 令牌中反序列化 org.springframework.core.env.MutablePropertySources 的实例;行:1,列:42](通过引用链:org.springframework.web.context.support.StandardServletEnvironment["propertySources"])
猜你喜欢
  • 2020-09-09
  • 2019-11-13
  • 2019-04-03
  • 2015-09-01
  • 2017-05-24
  • 2018-02-05
  • 2020-09-07
  • 1970-01-01
  • 2021-04-10
相关资源
最近更新 更多