在 Spring Boot 项目中启用 Multimap 的 json 序列化

Posted

技术标签:

【中文标题】在 Spring Boot 项目中启用 Multimap 的 json 序列化【英文标题】:Enable json serialization of Multimap in Spring Boot Project 【发布时间】:2015-09-02 18:50:04 【问题描述】:

我想在 Spring Boot 应用程序中序列化一些 google guava Multimap。

public class SomeDTO 
    @JsonProperty
    Multimap<A, B> prop = HashMultimap.create();

不使用自定义的杰克逊序列化程序,我得到一些结果,例如


   "prop ":
   
       "empty": false
   

这不是我想要得到的。我想到了类似的东西:


  "nodes": 
    "key0": [
      
        "prop0": 2,
        "prop1": 4
      ,
      
        "prop0": 5,
        "prop1": 6
      
    ],
    "key1": [
      
        "prop0": 23,
        "prop1": 0
      
    ]
  

添加

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-guava</artifactId>
            <version>$jackson.version</version>
        </dependency>

到 pom.xml 似乎还不够……但是,我只是从整个春天开始 // 举足轻重的宇宙,所以我想我错过了一些明显的东西。

【问题讨论】:

【参考方案1】:

我想出的解决方案是简单地将@Bean 添加到我的主要@Configuration

import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.datatype.guava.GuavaModule;
// More-obvious imports missing

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends SpringBootServletInitializer 

    public static void main(final String[] args) 
        SpringApplication.run(Application.class, args);
    

    @Override
    protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) 
        return application.sources(Application.class);
    

    @Bean
    ObjectMapper customizeJacksonConfiguration() 
        ObjectMapper om = new ObjectMapper();
        om.registerModule(new GuavaModule());
        return om;
    

Afaik,ObjectMapper Bean 方法有一个缺点:每次以这种方式创建 ObjectMapper 时,所有以前的配置都会被丢弃。

如果你想添加一个模块到 jackson - 而不是覆盖以前的配置,这种方法更好:

import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.datatype.guava.GuavaModule;
// More-obvious imports missing

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends SpringBootServletInitializer 

    public static void main(final String[] args) 
        SpringApplication.run(Application.class, args);
    

    @Override
    protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) 
        return application.sources(Application.class);
    

    @Bean
    public Module guavaModule() 
        return new GuavaModule();
    

【讨论】:

Imo,一个新的答案会是有利的;)我实际上忘记了这个问题。但是,是的,你是完全正确的。使用模块不会弄乱它依赖于 objectmapper 的整个 spring 应用程序。 @尼尔

以上是关于在 Spring Boot 项目中启用 Multimap 的 json 序列化的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot 项目中启用 Multimap 的 json 序列化

Spring Boot Multi Module Gradle Project 类路径问题:Package Not Found, Symbol not Found

Spring Boot启用Swagger2

如何启用Spring Boot Actuator的所有Endpoints

Creating a Multi Module Spring Boot Project

Spring Cloud Kubernetes - 启用配置重新加载时 Spring Boot 无法启动