Отображение выражения свойства orika

Дано

classA {

    long fahr;
....

а также

classB {
    long cels;
....

как я могу отобразить следующее в Orika?

A.fahr <-> (B.cels*9)/5   

Нужен ли мне индивидуальный картограф или фильтр?

2 ответа

Я предлагаю использовать преобразователь уровня поля, если оба имеют разные типы данных, но так как они имеют одинаковый тип данных, мы должны использовать специальный преобразователь для всего класса. Это образец конвертера, который подходит для этого варианта использования.

import ma.glasnost.orika.BoundMapperFacade;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.converter.ConverterFactory;
import ma.glasnost.orika.impl.DefaultMapperFactory;

public class EntryClass {

    public static void main(String[] args) {
        EntryClass ec = new EntryClass();
        BoundMapperFacade<A, B> facade = getMapperFactory().getMapperFacade(A.class, B.class);
        A fahr = new A(455);
        B cels = facade.map(fahr);
        System.out.println(cels);
        A revFahr = facade.mapReverse(cels);
        System.out.println(revFahr);
    }

    private static MapperFactory getMapperFactory() {
        MapperFactory factory = new DefaultMapperFactory.Builder()
                                .build();
        ConverterFactory cfactory = factory.getConverterFactory();
        cfactory.registerConverter(new FahrCelsConverter());
        factory.classMap(A.class, B.class)
                .field("fahr", "cels")
                .byDefault()
                .register();
        return factory;
    }
}

public class A {

    long fahr;

    public A(long fahr) {
        this.fahr = fahr;
    }


    public long getFahr() {
        return fahr;
    }


    public void setFahr(long fahr) {
        this.fahr = fahr;
    }


    @Override
    public String toString() {
        return "A [fahr=" + fahr + "]";
    }
}

public class B {

    long cels;

    public B(long cels) {
        this.cels = cels;
    }

    public long getCels() {
        return cels;
    }

    public void setCels(long cels) {
        this.cels = cels;
    }

    @Override
    public String toString() {
        return "B [cels=" + cels + "]";
    }
}

public class FahrCelsConverter extends BidirectionalConverter<A, B>
{
@Override
public B convertTo(A source, Type<B> destinationType, MappingContext mappingContext) {      
    if(source != null)
    {
        return new B((source.fahr - 32) * 5 / 9);
    }
    return null;
}

@Override
public A convertFrom(B source, Type<A> destinationType, MappingContext mappingContext) {
    if(source != null)
    {
        return new A((source.cels / 5) * 9 + 32);
    }
    return null;
}
}

Это больше подходит для использования конвертера (по id).

Другие вопросы по тегам