9

您好我正在尝试将 vavr 添加到我的项目中,现在我正在努力正确序列化 Vavr.List 对象。下面是我的控制器:

import io.vavr.collection.List;

 @GetMapping(value = "/xxx")
    public List<EntityDeleted> getFile() {
        return List.of(new EntityDeleted(true),new EntityDeleted(true),new EntityDeleted(true),new EntityDeleted(true));
}

EntityDeleted 是我的自定义对象,List 是 Vavr 集合,如导入语句中所示。我在邮递员中得到的回应是:

{
    "empty": false,
    "lazy": false,
    "async": false,
    "traversableAgain": true,
    "sequential": true,
    "singleValued": false,
    "distinct": false,
    "ordered": false,
    "orNull": {
        "deleted": true
    },
    "memoized": false
}

我期望我的对象的 JSON 列表。下面是我的配置:

@SpringBootApplication
public class PlomberApplication {

    public static void main(String[] args) {
        SpringApplication.run(PlomberApplication.class, args);
    }

    @Bean
    public ObjectMapper jacksonBuilder() {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.registerModule(new VavrModule());
    }
}

和一点 pom.xml

 <dependency>
            <groupId>io.vavr</groupId>
            <artifactId>vavr</artifactId>
            <version>0.9.0</version>
        </dependency>
        <dependency>
            <groupId>io.vavr</groupId>
            <artifactId>vavr-jackson</artifactId>
            <version>0.9.0</version>
        </dependency>
4

3 回答 3

9

Spring Boot 检索com.fasterxml.jackson.databind.Module类的所有实例并用它们初始化ObjectMapper。不需要额外的魔法。

我的依赖项如下(Spring Boot 1.5.7.RELEASE):

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    compile group: 'io.vavr', name: 'vavr', version: '0.9.1'
    compile group: 'io.vavr', name: 'vavr-jackson', version: '0.9.1'
}

应用程序配置如下:

@SpringBootApplication
public class BootvavrApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootvavrApplication.class, args);
    }

    @Bean
    Module vavrModule() {
        return new VavrModule();
    }
}

和控制器映射如下:

import io.vavr.collection.List;
@RestController
class TestController {

    @GetMapping("/test")
    List<String> testing() {
        return List.of("test", "test2");
    }
}

输出是:

["test","test2"]

你可以在这里查看代码:https ://github.com/mihn/bootvavr

于 2017-09-26T15:00:20.270 回答
1

我不熟悉 SpringBoot,但似乎你应该返回VavrModule对象而不是ObjectMapper你的jacksonBuilder()方法。

我基于这些链接:

于 2017-09-18T20:45:42.750 回答
1

您注册为 bean的ObjectMapper不是用来序列化为 JSON 的,Spring MVC 不会使用它,因为它不是他想要的。

为了处理 HTTP Spring MVC 的内容,使用HttpMessageConverter并且如果他在类路径中检测到 Jackson,如果未指定,则会自动配置MappingJackson2HttpMessageConverter 。

在 Spring Boot 中添加应该足以注册自定义 MessageConverter:

@Bean  
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();   
    ObjectMapper mapper = new ObjectMapper();

    mapper.registerModule(new VavrModule());

    // Spring MVC default Objectmapper configuration
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);

    jacksonConverter.setObjectMapper(mapper);   
    return jacksonConverter;  
}

在纯 Spring MVC 应用程序中,您必须在WebMvcConfigurerAdapter类中有以下代码:

@Bean  
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();   
    ObjectMapper mapper = new ObjectMapper();

    mapper.registerModule(new VavrModule());

    // Spring MVC default Objectmapper configuration
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);

    jacksonConverter.setObjectMapper(mapper);   
    return jacksonConverter;  
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(customJackson2HttpMessageConverter());
    super.addDefaultHttpMessageConverters();
}

Spring MVC 中关于 ObjectMapper 的一些文档

希望它有所帮助!

于 2017-09-20T21:13:55.797 回答