복붙노트

[SPRING] Dozer의 사용자 지정 변환기를 사용하여 개체 목록을 다른 목록에 매핑

SPRING

Dozer의 사용자 지정 변환기를 사용하여 개체 목록을 다른 목록에 매핑

내가하려고하는 것은 Dozer를 사용하여 Entity List를 String ID 목록에 매핑하는 것입니다.

분명히 그것은 Custom Converter를 의미합니다. 내 첫 번째 아이디어는 MyEntity에서 String으로 변환기를 만든 다음 Dozer에게 "이 변환기를 사용하여이 컬렉션의 모든 개체를 매핑하십시오"와 같이 말합니다. 그러나 나는 그렇게하는 법을 알 수 없었다.

그래서 두 번째 아이디어는 변환기 목록을 엔티티 목록을 문자열 목록에 직접 작성하는 것이 었습니다. 이 아이디어에 내 문제는 내가 (뭔가 전혀 작동하지 않습니다) 아래와 같이 생성자에서 내 목록의 형식을 얻는 것입니다 우스꽝스럽게 strugling했다 :

public MyEntityListConverter() {
    super(List<MyEntity>.class, List<String>.class);
}

나는 아무것도 선언하지 않고 하나의 행에 인스턴스화 된 목록 클래스를 전달하는 방법을 모른다.

그래서 누군가가 다음 중 어느 것을 알고 있다면 :

해결법

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

    1.시도한 방식은 제네릭 형식 때문에 불가능합니다. 그리고 그렇다면 Dozer는 런타임에 유형을 감지 할 수 없습니다.

    시도한 방식은 제네릭 형식 때문에 불가능합니다. 그리고 그렇다면 Dozer는 런타임에 유형을 감지 할 수 없습니다.

    List <>가있는 첫 번째 솔루션

    귀하의 변환기 :

    public class MyEntityToStringConverter extends DozerConverter<MyEntity, String> {
        // TODO constructor + impl
    }
    

    귀하의지도 작성 :

    mapping(MyEntityA.class, MyEntityB.class)
    .fields("myEntityList", "myStringList",
        hintA(MyEntity.class),
        hintB(String.class));
    
    mapping(MyEntity.class, String.class)
    .fields(this_(), this_(), customConverter(MyEntityToStringConverter.class));
    

    목록 래퍼가있는 두 번째 솔루션

    목록 impl을 확장하는 사용자 정의 클래스를 만들려고 할 수 있습니다.

    public class MyEntityList extends ArrayList<MyEntity> {
    
    }
    
    public class MyStringList extends ArrayList<String> {
    
    }
    

    매핑하려는 상위 클래스에서 필드를 변경하십시오.

    귀하의 변환기 :

    public class MyEntityToStringConverter extends DozerConverter<MyEntityList, MyStringList> {
        // TODO constructor + impl
    }
    

    귀하의지도 작성 :

    mapping(MyEntityA.class, MyEntityB.class)
    .fields("myEntityList", "myStringList", customConverter(MyEntityToStringConverter.class));
    
  2. ==============================

    2.또 다른 옵션은

    또 다른 옵션은

    super((Class<List<MyEntity>>) (Class<?>) List.class,(Class<List<String>>) (Class<?>) List.class);
    
  3. ==============================

    3.@ 루도비크 해결책에 매우 관심이 있었지만 거기에 내 의견에 언급 된 바와 같이 잡을 수도 있습니다.

    @ 루도비크 해결책에 매우 관심이 있었지만 거기에 내 의견에 언급 된 바와 같이 잡을 수도 있습니다.

    그러나 약간의 비틀기는 저를 위해 작동합니다 - 필드 레벨이 아닌 "설정"에서 커스텀 컨버터를 등록하십시오. XML 설정을 사용하고 있지만 설정 코딩과 함께 작동해야합니다.

    <configuration>
      <custom-converters>
        <converter type="f.q.c.n.MyEntityToStringConverter">
          <class-a>java.lang.String</class-a>
          <class-b>f.q.c.n.MyEntity</class-b>
        </converter>
      </custom-converters>
    </configuration>
    
  4. from https://stackoverflow.com/questions/29033756/map-a-list-of-object-to-another-list-using-dozers-custom-converters by cc-by-sa and MIT license