3

Java Bean 間の変換にDozerフレームワークを使用しています。カスタム コンバーターを操作および構成できるようにするために、XML の代わりに Dozer の Java Api を使用してマッピングを作成したいと考えています。

alt 2 を削除して以下のコードで代替 1 を使用してコンバーターを実行すると、変換は正常に機能し、カスタム コンバーターが呼び出されます。代替 2 (Java API を使用したマッピング) を使用してコンバーターを実行すると、マッパーはコンバーターを呼び出しません。Bean は変換されますが、同じ型のネストされたフィールドは無視されます。以下のコードでは、親フィールドは変換後に null になります。

Organization org = ...init organization....
OrganizationDto orgDto = new MyConverter().convert(organization, OrganizationDto.class);
assertEquals(3,orgDto.getParent().getX()) //Fails due to NPE since parent field is not copied

クラス レベルのカスタム コンバーターは Java API ではサポートされていませんが、フィールド レベルのコンバーターは Java マッピング API ので提供されているため、サポートされているようです。

(Dozer の作成者が Dozer をシングルトンとして使用することを推奨していることも承知していますが、それは以下のサンプルには含まれていません。)

ヒントはありますか?

public class OrganizationDto {
   int x;
   OrganizationDto parent ;
   // getters and setters....
}

public class Organization {
   int x;
   Organization parent ;
   // getters and setters....
}


public class MyConverter{


private DozerBeanMapper mapper = null;

public MyConverter() {
        mapper = new DozerBeanMapper();
        // Alternative 1 - works 
//          List<String> myMappingFiles = new ArrayList<String>();
//          myMappingFiles.add("myBeanMappings.xml");
//          mapper.setMappingFiles(myMappingFiles);

        // Alternative 2 - does not work
        Map<String,CustomConverter> customConvertersWithId = new HashMap<String, CustomConverter>();
        customConvertersWithId.put("OrganizationDetailsConverter", new OrganizationDetailsConverter());
        mapper.setCustomConvertersWithId(customConvertersWithId);

        // Also tried variants using
        //mapper.setCustomConverters(Collections.<CustomConverter> singletonList(new OrganizationDetailsConverter()));

        BeanMappingBuilder builder = new BeanMappingBuilder() {
            protected void configure() {
                mapping(OrganizationDto.class, Organization.class)
                .fields("parent",
                        "parent",
                        customConverterId("OrganizationDetailsConverter"));
                }
            };          
            mapper.addMapping(builder);
    }

    public <T, S> T convert(S fromBean, Class<T> toBeanClass) {
    return mapper.map(fromBean, toBeanClass);
    }

}



<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://dozer.sourceforge.net
      http://dozer.sourceforge.net/schema/beanmapping.xsd">
    <mapping>
        <class-a>foo.OrganizationDto</class-a>
        <class-b>foo.Organization</class-b>
        <field custom-converter="foo.OrganizationDetailsConverter">
            <a>parent</a>
            <b>parent</b>
        </field>
    </mapping>
</mappings>
4

1 に答える 1