0

给定

classA {

    long fahr;
....

classB {
    long cels;
....

如何在 Orika 中映射以下内容?

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

我需要定制的 Mapper 或 Filter 吗?

4

2 回答 2

1

如果两者都属于不同的数据类型,我建议使用字段级转换器,但由于它们具有相同的数据类型,我们必须为整个类使用自定义转换器。这是适合此用例的示例转换器。

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;
}
}
于 2016-12-11T07:34:13.133 回答
0

它更适合使用转换器(通过 id)。

于 2015-03-03T13:33:47.047 回答