2015-03-02 61 views
0

鉴于orika属性表达式映射

classA { 

    long fahr; 
.... 

classB { 
    long cels; 
.... 

我怎么能映射Orika以下?

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

我需要自定义的映射器还是过滤器?

回答

0

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

0

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

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; 
} 
}