在 Spring Boot 端点上使用自定义杰克逊映射器

Posted

技术标签:

【中文标题】在 Spring Boot 端点上使用自定义杰克逊映射器【英文标题】:Use custom jackson mapper on spring boot endpoints 【发布时间】:2017-06-28 20:52:21 【问题描述】:

我想在从 AbstractEndpoints 派生的端点上使用不同的 jackson ObjectMapper 实例(而不是在其他映射的 url 上使用的实例)。

为了澄清这个问题,我不想更改或自定义由 AbstractEndpoints 派生的不同 url 使用的对象映射器(如 HealtEndpointMetricsEndpoint )。我想专门将新的对象映射器注入到管理端点中。

【问题讨论】:

定义自定义@Bean 对您不起作用吗?见docs.spring.io/spring-boot/docs/current/reference/html/…。 欢迎来到 Stack Overflow!请带上tour,环顾四周,通读help center,尤其是How do I ask a good question? 和What topics can I ask about here?。 【参考方案1】:

从 Spring Boot 1.5 开始,您可以自定义 JMX 端点正在使用的 ObjectMapper,但不是以您想要的方式。正如您在constructor of EndpointMBean 中所看到的,它采用ObjectMapper 作为参数,但没有任何qualifiers。因此它会自动使用默认的ObjectMapper,除了更改原始源或滚动您自己的端点并添加必要的限定符之外,您无能为力。

如果您仍然想使用 Spring Boot 提供的默认端点,请根据需要自定义默认 ObjectMapper,创建与原始配置匹配的第二个实例并添加限定符以使用第二个 ObjectMapper 在您的自己的代码。 customization options for Jackson's ObjectMapper are described in the Spring Boot docs 并在How to customise the Jackson JSON mapper implicitly used by Spring Boot? 中进行了讨论。

【讨论】:

【参考方案2】:

如果您想完全替换默认 ObjectMapper,请定义该类型的 @Bean 并将其标记为 @Primary,或者,如果您更喜欢基于构建器的方法,请定义 Jackson2ObjectMapperBuilder @Bean。请注意,无论哪种情况,这都会禁用 `ObjectMapper 的所有自动配置。

如果您提供任何类型为 MappingJackson2HttpMessageConverter 的 @Bean,那么它们将替换 MVC 配置中的默认值。此外,还提供了一个 HttpMessageConverters 类型的便利 bean(如果您使用默认 MVC 配置,则始终可用),它具有一些有用的方法来访问默认和用户增强的消息转换器。

您可以阅读文档中的完整主题:73.3 Customize the Jackson ObjectMapper

https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-customize-the-jackson-objectmapper

【讨论】:

不幸的是,它并没有解决我的问题。当我在我的问题中添加了一些额外的信息时,我需要另一个对象映射器 bean 来专门用于从 AbstractEndpoints 派生的管理端点。

以上是关于在 Spring Boot 端点上使用自定义杰克逊映射器的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot 使用@Endpoint注解自定义端点, 不能通过 Restfult 访问问题 原因分析

Spring boot 使用@Endpoint注解自定义端点, 不能通过 Restfult 访问问题 原因分析

Spring boot 使用@Endpoint注解自定义端点, 不能通过 Restfult 访问问题 原因分析

Spring boot 使用@Endpoint注解自定义端点, 不能通过 Restfult 访问问题 原因分析

java Spring Boot 2自定义端点示例

Spring boot 使用@Endpoint注解自定义端点, 不能通过 Restfult 访问问题处理方法