Dozer копирует карту на другую карту

Я пытался скопировать карту (String, ProposalViewBean) на другую карту (String, Proposal)

Я создал собственный конвертер:

public class ProposalsDozerConverter  extends DozerConverter <HashMap<String,Proposal>, HashMap<String,ProposalViewBean>> {

    @Resource(name="mapper")
    private Mapper mapper;


    public ProposalsDozerConverter(Class<HashMap<String, Proposal>> prototypeA,
                                                      Class<HashMap<String, ProposalViewBean>> prototypeB) {

        super(prototypeA, prototypeB);

    }

    @Override
    public HashMap<String, Proposal> convertFrom( HashMap<String, ProposalViewBean> proposalsViewBean, HashMap<String, Proposal> proposals) {

        System.out.println("convertFrom");

        /*if (proposals == null){
            proposals = new TreeHashMap<String, Proposal>();
        }*/

        for (Map.Entry<String, ProposalViewBean> entry : proposalsViewBean.entrySet()){
            Proposal p = mapper.map(entry.getValue(), Proposal.class);
            proposals.put(entry.getKey(), p);
        }

        return proposals;
    }

    @Override
    public HashMap<String, ProposalViewBean> convertTo(HashMap<String, Proposal> proposals, HashMap<String, ProposalViewBean> proposalsViewBean) {

        System.out.println("convertTo");

        /*if (proposalsViewBean == null){
            proposalsViewBean = new TreeMap<String, ProposalViewBean>();
        }*/

        for (Map.Entry<String, Proposal> entry : proposals.entrySet()){
            ProposalViewBean p = mapper.map(entry.getValue(), ProposalViewBean.class);
            proposalsViewBean.put(entry.getKey(), p);
        }

        return proposalsViewBean;
    }

Затем я настроил в XML:

<configuration>
    <custom-converters>
        <converter type="com.hsbc.hbbr.frb.converters.ProposalsDozerConverter">
            <class-a>java.util.HashMap</class-a>
            <class-b>java.util.HashMap</class-b>
        </converter>
    </custom-converters>
</configuration>

<mapping>
    <class-a>com.hsbc.hbbr.frb.viewbean.ConsumerLoanViewBean</class-a>
    <class-b>com.hsbc.hbbr.frb.model.ConsumerLoan</class-b>
    <field custom-converter="com.hsbc.hbbr.frb.converters.ProposalsDozerConverter">
        <a>proposals</a>
        <b>proposals</b>
        <a-hint>com.hsbc.hbbr.frb.viewbean.ProposalViewBean</a-hint>
        <b-hint>com.hsbc.hbbr.frb.model.Proposal</b-hint>
    </field>
</mapping>

Когда я пытался преобразовать, я ловлю эту ошибку:

Caused by: java.lang.InstantiationException: com.hsbc.hbbr.frb.converters.ProposalsDozerConverter
at java.lang.Class.newInstance(Class.java:359)

Я понятия не имею, как это исправить. Кто-нибудь сталкивался с этой проблемой?


person Raphael Milani    schedule 25.06.2015    source источник
comment
Судя по XML и коду Java, порядок не совпадает. Попробуйте сделать ConsumerLoan class-a и посмотрите, даст ли это что-нибудь.   -  person ColinMc    schedule 25.06.2015
comment
Привет @ColinMc, я нашел решение. В моем коде и XML было несколько ошибок.   -  person Raphael Milani    schedule 26.06.2015


Ответы (1)


Я нашел решение своей проблемы. В моем коде и XML было несколько ошибок. Сначала мне нужно было изменить отображение:

<mapping>
        <class-a>com.hsbc.hbbr.frb.viewbean.ConsumerLoanViewBean</class-a>
        <class-b>com.hsbc.hbbr.frb.model.ConsumerLoan</class-b>
        <field custom-converter="com.hsbc.hbbr.frb.converters.ProposalsDozerConverter">
            <a>proposals</a>
            <b>proposals</b>
            <a-hint>java.util.HashMap</a-hint>
            <b-hint>java.util.HashMap</b-hint>
        </field>
    </mapping>

Мое намерение состояло в том, чтобы скопировать карту на другую карту, а не копировать объект внутри карты.

После того, как я проверил свой конвертер, я понял, что весной не был отправлен экземпляр Mapper:

@Resource(name="mapper")
private Mapper mapper;

Это было причиной исключения. Чтобы получить экземпляр Mapper, мне нужно было реализовать интерфейс MapperAware. Реализовать этот интерфейс Dozer внедряет экземпляр Mapper. Мне пришлось изменить конструктор класса:

public ProposalsDozerConverter() {
        super( ((Class<HashMap<String,Proposal>>) (Class<?>) HashMap.class), (Class<HashMap<String,ProposalViewBean>>) (Class<?>) HashMap.class  );
    } 

Потому что необработанный тип сотрется во время выполнения. Таким образом, Dozer не знает, что за объект находится внутри Map. Мой окончательный код:

public class ProposalsDozerConverter  extends DozerConverter <HashMap<String,Proposal>, HashMap<String,ProposalViewBean>>
                                                                                                implements MapperAware {
    private Mapper mapper;

    public ProposalsDozerConverter() {
        super( ((Class<HashMap<String,Proposal>>) (Class<?>) HashMap.class), (Class<HashMap<String,ProposalViewBean>>) (Class<?>) HashMap.class  );
    }

    @Override
    public HashMap<String, Proposal> convertFrom( HashMap<String, ProposalViewBean> proposalsViewBean, HashMap<String, Proposal> proposals) {

        for (Map.Entry<String, ProposalViewBean> entry : proposalsViewBean.entrySet()){
            Proposal p = mapper.map(entry.getValue(), Proposal.class);
            proposals.put(entry.getKey(), p);
        }

        return proposals;
    }

    @Override
    public HashMap<String, ProposalViewBean> convertTo(HashMap<String, Proposal> proposals, HashMap<String, ProposalViewBean> proposalsViewBean) {

        for (Map.Entry<String, Proposal> entry : proposals.entrySet()){
            ProposalViewBean p = mapper.map(entry.getValue(), ProposalViewBean.class);
            proposalsViewBean.put(entry.getKey(), p);
        }

        return proposalsViewBean;
    }

    @Override
    public void setMapper(Mapper mapper ) {
        this.mapper = mapper;
    }
}
person Raphael Milani    schedule 26.06.2015