2017-09-18 2 views
2

안녕하세요 지금 Vavr.List 객체의 적절한 직렬화 작업에 어려움을 겪고있는 Im은 내 프로젯에 vavr을 추가하려고합니다. 아래 내 컨트롤러가 있습니다 :Vavr 객체의 시리얼 라이저/디시리얼라이저

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는 import 문에 표시된대로 Vavr 컬렉션입니다. Postman에 들어가는 응답 Im :

{ 
    "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> 

답변

0

봄 부팅 com.fasterxml.jackson.databind.Module 클래스의 모든 인스턴스를 검색하고 그들과 함께 ObjectMapper를 초기화합니다. 마법을 추가 할 필요가 없습니다.

내 의존성은 다음과 같습니다 (스프링 부트 1.5.7.RELEASE) :

@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"] 

당신은을 확인할 수 있습니다 응용 프로그램과 함께

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' 
} 

이 같은 configurured 여기에서 코드 : https://github.com/mihn/bootvavr

+2

해결책을 찾았습니다. 내 구성 클래스 중 하나에서 @EnableWebMvc 주석을 사용하여 매퍼에 내 구성을 대체합니다. – filemonczyk

+0

오! 그럴 수 있습니다. :) – mihn

1

나는 SpringBoot에 익숙하지 해요,하지만 당신이 당신의 jacksonBuilder() 방법 대신 ObjectMapperVavrModule 객체를 반환해야합니다 보인다 .

나는이 링크를 자신의 기준 : 빈은 하나가 JSON으로 직렬화 할 수있는 사용이 그냥 그대로

+0

@Bean을 시도했습니다. public 모듈 jacksonBuilder() { return VavrModule(); }하지만 작동하지 않습니다. 내 Mapper를 무언가가 무시하고 있다고 가정합니다. – filemonczyk

1

ObjectMapper 등록 Spring MVC는 자신이 원하는 바를 사용하지 않기 때문에 사용하지 않는다.

HTTP 용 컨텐츠 처리 Spring MVC는 HttpMessageConverter을 사용하고 클래스 패스에서 Jackson을 발견하면 MappingJackson2HttpMessageConverter은 지정되지 않은 경우 자동 구성됩니다.

봄 부팅에서

사용자 정의는 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; 
} 

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

: 당신이 WebMvcConfigurerAdapter 클래스에 다음 코드를 가지고해야 할 것입니다 순수 스프링 MVC 응용 프로그램에서

@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; 
} 

Some Documentation about ObjectMapper in Spring MVC

희망이있었습니다.

+0

나는 또한 시도했지만 여전히 첫 번째 게시물에서와 같은 결과를 얻었습니다. – filemonczyk

+0

@Bean 외에 @Primary를 추가하려고 했습니까? 그리고 어떤 버전의 스프링 부트를 사용하고 있습니까? –

+0

@ primim 시도, 1.5.3 스프링 부트 사용 – filemonczyk