是否可以为单个 Spring Rest 端点自定义 ObjectMapper?

Posted

技术标签:

【中文标题】是否可以为单个 Spring Rest 端点自定义 ObjectMapper?【英文标题】:Is it possible to customize ObjectMapper for single Spring Rest endpoint? 【发布时间】:2021-08-14 02:57:06 【问题描述】:

我知道如何自定义默认的ObjectMapper bean。但是对于一个特定的控制器/端点,我想使用不同的对象映射器。我该怎么做?

我认为我的问题与one 类似,但还没有答案。很高兴在那里得到答案并将其标记为重复

【问题讨论】:

我试着想出an answer! xDxD(10 年后)..虽然旧问题的答案是“否”,但我认为您的答案是“可能”! :) 如果您可以通过 (java, media)"type" (在 spring-data-rest 中为“正常”)来构建您的端点,您可以拥有自定义的 objectmapper “per endpoint”。 这很聪明,不知道你能做到。我赞成你的回答。但是,出于我的目的,返回的对象是Map<String,Object>,我不知道更改媒体类型。我没有提到这是针对 graphql 端点的。 我最终使用自定义对象映射器将对象写入字符串并将返回类型更改为字符串 感谢您的支持! (我认为它也适用于Map,但不适用于泛型类型<String, Object> ..我将我的想法发布为答案..很快;) 我明白你了,凯恩! :) 您在 github 操场上可以做的事情可能不适用于“现实世界”! ...发布您的解决方案!这是一个“不错的黑客”! 【参考方案1】:

@xerx593 在问题的 cmets 中提供了一个很好的解决方案,但我采用了不同的方法,因为我返回的是通用的 Map<String,Object> graphql 返回类型,我对更改媒体类型或应用所有Map 的对象映射器。我更喜欢他们针对一般情况的解决方案,因为它更优雅

我只是将返回对象序列化为字符串并返回。

比如我翻了这样的东西

@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public Foo getFoo() 
  return new Foo();

这样的事情

private ObjectMapper customMapper = ...;

@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public String getFoo() 
  return customMapper.writeValueAsString(new Foo());

【讨论】:

以上是关于是否可以为单个 Spring Rest 端点自定义 ObjectMapper?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以设置 Undertow 来服务 Spring REST 端点?

Wordpress Rest Api 在自定义端点上使用 POST 更新内容

AppDynamics 将包含 UUID 的 REST 端点分组为单个业务事务

将 spring boot 执行器健康端点更改为自定义端点

如何处理 Spring Rest API 上的内部服务器错误(500)以自定义消息?

具有授权的 Keycloak 自定义 SPI REST 端点