如何让 webflux 端点用每个项目的对象名称序列化 json

Posted

技术标签:

【中文标题】如何让 webflux 端点用每个项目的对象名称序列化 json【英文标题】:How to get webflux endpoint to serialize json with object name for each item 【发布时间】:2021-10-09 13:53:29 【问题描述】:

我有一个返回项目数组的 webflux 端点。我试图让它将对象名称添加到@JsonRootName 指定的数组中的每个项目中。我试过像这样使用 Jackson2ObjectMaper 配置对象映射器。我正在使用 SpringBoot 2.4.4。

@Configuration
@EnableWebFlux
public class JacksonConfig 

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customizer() 
        return builder -> 
            builder.modules(new JavaTimeModule());
            builder.featuresToEnable(SerializationFeature.WRAP_ROOT_VALUE);
            builder.featuresToEnable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
            builder.indentOutput(true);
        ;
    

我的端点如下:

@GetMapping(value = "/all/id", produces = "application/json")
public ResponseEntity<Flux<EventsMetaData>> getAllEventsByUser(@PathVariable String id) 
    return ResponseEntity.ok(eventsMetaDataService.getAllEventsByUserId(id));

Json 响应是:

[
    
        "id": "342424234",
        "userid": "34324242",
        "eventId": null,
        "eventName": "Test 1",
        "eventDetails": null
    ,
    
        "id": "43435235",
        "userid": "34244242",
        "eventId": null,
        "eventName": "Test",
        "eventDetails": null
    
]

预期输出:

[
   Event: 
        "id": "342424234",
        "userid": "34324242",
        "eventId": null,
        "eventName": "Test 1",
        "eventDetails": null
    ,
    Event: 
        "id": "43435235",
        "userid": "34244242",
        "eventId": null,
        "eventName": "Test",
        "eventDetails": null
    
]

但是,当我的对象使用 @JsonRootName 注释时,我没有得到根对象

@JsonRootName(value = "Event")
public class Event 

欢迎提出任何建议。

编辑: 从配置中删除 @EnableWebFlux 后,它给了我一个根包装值,但仍然不像它应该使用列表那样:


    "List": [
        
            "id": "610bd71077cfcd2ee941217c",
            "eventName": "Test",
            "eventDetails": null,
            "eventDateTime": null,
            "eventLink": null
        
    ]

然而,单个对象会像这样尊重包装器:


    "event": 
        "id": "610bd71077cfcd2ee941217c",
        "eventName": "Test",
        "eventDetails": null,
        "eventDateTime": null,
        "eventLink": null
    

链接到复制项目https://gitlab.com/dmbeer/so-68651608 即使json结构错误,测试列表也不应该存在。

【问题讨论】:

【参考方案1】:

我认为你需要像这样配置Bean

@Configuration
public class ApplicaitonConfiguration 

    @Bean
    ObjectMapper objectMapper() 

        var mapper = JsonMapper.builder().addModules(new JavaTimeModule()).build();

        // Enable your features...

        return mapper;
    

【讨论】:

试过这个,但没有运气仍然是相同的输出。似乎 RestController 没有使用配置的 ObjectMapper 它不像你期望的那样工作,因为你想要的甚至不是一个有效的 JSON。 请参阅已编辑的问题,包装器不应显示列表,而是将事件作为单个项目显示。以及为什么当我删除 @EnableWebFlux 时它会起作用 因为我看不到你的整个代码库,所以很难说为什么删除 EnableWebFlux 有效。至于 JSON,您的预期输出甚至不是有效的 JSON。 我添加了一个指向具有相同问题的复制项目的链接。即使 json 结构错误,文本列表也不应该存在。

以上是关于如何让 webflux 端点用每个项目的对象名称序列化 json的主要内容,如果未能解决你的问题,请参考以下文章

禁用执行器健康端点的 webflux(反应式)安全性

Spring WebFlux WebClient 弹性和性能

如何使用 Spring WebFlux 为执行器端点添加 URL 别名?

如何使用 webflux 端点从 React 生成 json 流

如何在 spring-mvc 中将日志记录添加到 webflux 端点?

将消息推送到谷歌云发布订阅后如何返回对 webflux 端点的响应?