2015-03-02 120 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; 
} 
}