복붙노트

[SPRING] Spring / json : List <MyPojo>와 같은 형식화 된 컬렉션 변환

SPRING

Spring / json : List 와 같은 형식화 된 컬렉션 변환

목록을 마샬링하려고합니다 : Spring Rest Template을 통해 개체를 나열하십시오.

간단한 Pojo 객체를 전달할 수 있지만 List 객체를 보내는 방법을 설명하는 설명서는 찾을 수 없습니다.

Spring은 Jackson JSON을 사용하여 HttpMessageConverter를 구현합니다. jackson 문서에서는 다음 내용을 다룹니다.

Spring 템플릿에서이 작업을 수행 할 수 있습니까? 나는 코드를 한눈에 살펴 봤지만 나에게 유익하지는 못했지만 어쩌면 나는 어떤 트릭을 모른다.

해결책

아래의 유용한 답변 덕분에 궁극적 인 해결책은 List를 보내지 않고 List를 단순히 확장하는 단일 객체를 보내는 것입니다. class PojoList extends ArrayList . Spring은이 Object를 성공적으로 마샬링 할 수 있고, List 를 보내는 것과 같은 일을 수행한다. 또한 HttpMessageConverter 인터페이스의 단점을 해결하기 위해 JIRA를 봄에 게시했습니다.

해결법

  1. ==============================

    1.MappingJacksonHttpMessageConverter에 대한 문서를 올바르게 읽으면 MappingJacksonHttpMessageConverter의 하위 클래스를 만들고 등록하고 getJavaType (Class ) 메서드를 재정의해야합니다.

    MappingJacksonHttpMessageConverter에 대한 문서를 올바르게 읽으면 MappingJacksonHttpMessageConverter의 하위 클래스를 만들고 등록하고 getJavaType (Class ) 메서드를 재정의해야합니다.

    protected JavaType getJavaType(Class<?> clazz) {
       if (List.class.isAssignableFrom(clazz)) {
         return TypeFactory.collectionType(ArrayList.class, MyBean.class);
       } else {
         return super.getJavaType(clazz);
       }
    }
    
  2. ==============================

    2.Spring 3.2에서 RestTemplate에 대한 새로운 exchange () - 메소드를 사용하는 제네릭 형식에 대한 지원이 추가되었습니다.

    Spring 3.2에서 RestTemplate에 대한 새로운 exchange () - 메소드를 사용하는 제네릭 형식에 대한 지원이 추가되었습니다.

     ParameterizedTypeReference<List<MyBean>> typeRef = new ParameterizedTypeReference<List<MyBean>>() {};
     ResponseEntity<List<MyBean>> response = template.exchange("http://example.com", HttpMethod.GET, null, typeRef);
    

    매력처럼 작동합니다!

  3. ==============================

    3.제네릭 형식 매개 변수가 포함되도록하는 한 가지 방법은 목록 또는지도 유형을 실제로 하위 클래스로 지정하는 것과 같습니다.

    제네릭 형식 매개 변수가 포함되도록하는 한 가지 방법은 목록 또는지도 유형을 실제로 하위 클래스로 지정하는 것과 같습니다.

    static class MyStringList extends ArrayList<String> { }
    

    그 목록의 인스턴스를 돌려 준다.

    그렇다면 이것이 왜 다른 점이 있습니까? 제네릭 형식 정보는 메서드 및 필드 선언, 수퍼 형식 선언 등 몇 가지 위치에서만 유지되므로 따라서 "raw"List에는 런타임 유형 정보가 포함되지 않지만 "MyStringList"의 클래스 정의는 해당 슈퍼 유형 선언을 통해 수행됩니다. 겉으로보기에 형식화 된 변수에 대한 할당은 도움이되지 않습니다. 실제 형식 정보는 Class 인스턴스 (또는 JavaType 및 Java 형식의 TypeReference와 같은 lib 제공 확장자)에서만 전달됩니다.

    이 외에도 Jackson을 JavaType 또는 TypeReference에 전달하여 값을 전달하는 방법을 알아야합니다.

  4. from https://stackoverflow.com/questions/6173182/spring-json-convert-a-typed-collection-like-listmypojo by cc-by-sa and MIT license