標籤:href struct get 作用 應用 tar 自訂 ret 建立
第三節MapStruct--Defining a mapper
在這一章節你將學到如何用mapstruct和它的一些必要的操作選項來定義一個bean mapper。
3.1 Basic mappings
建立一個java介面類,使用必要的方法和註解來建立一個簡單的mapper,其中要用到org.mapstruct.Mapper包的註解:
例6:
@Mapperpublic interface CarMapper { @Mappings({ @Mapping(source = "make", target = "manufacturer"), @Mapping(source = "numberOfSeats", target = "seatCount") }) CarDto carToCarDto(Car car); @Mapping(source = "name", target = "fullName") PersonDto personToPersonDto(Person person);}
@Mapper註解可以致使MapStruct代碼產生器在編譯時間期建立一個CarMapper介面的實作類別。
在產生的實現方法中,會從Car類源中讀取所有可讀屬性欄位,複製並綁定到目標類CarDto中。如果等價屬性間(類源--目標類)出現欄位變數名不同的情況,我們可以使用@Mapper註解來自訂指定。
為了更好的理解MapStruct都做了些什麼,可以查看接下來的例子:
例7.MapStruct產生的程式碼(carToCarDto)
// GENERATED CODEpublic class CarMapperImpl implements CarMapper { @Override public CarDto carToCarDto(Car car) { if ( car == null ) { return null; } CarDto carDto = new CarDto(); if ( car.getFeatures() != null ) { carDto.setFeatures( new ArrayList<String>( car.getFeatures() ) ); } carDto.setManufacturer( car.getMake() ); carDto.setSeatCount( car.getNumberOfSeats() ); carDto.setDriver( personToPersonDto( car.getDriver() ) ); carDto.setPrice( String.valueOf( car.getPrice() ) ); if ( car.getCategory() != null ) { carDto.setCategory( car.getCategory().toString() ); } carDto.setEngine( engineTtoEngineDto( car.getEngine() ) ); return carDto; } @Override public PersonDto personToPersonDto(Person person) { //... } private EngineDto engineToEngineDto(Engine engine) { if ( engine == null ) { return null; } EngineDto engineDto = new EngineDto(); engineDto.setHorsePower(engine.getHorsePower()); engineDto.setFuel(engine.getFuel()); return engineDto; }}
通常MapStruct的代碼建置原則是儘可能多的查看使用者的自訂策略。特別是這意味著所有的這些值都將有計劃的通過getter/seter方法從源類複製到目標類,而不是通過反射或者其他方式。
從例子中可以發現,所有通過註解指定的映射都被MapStruct作用到了代碼產生中。如果映射屬性的類型在源和目標實體中是不同的,MapStruct將要麼應用自動轉換,要麼可選地調用/建立另一映射方法。若且唯若源和目標屬性是簡單的bean屬性(即變數類型不是集合或字典類型),MapStruct才會建立一個新映射。
MapStruct映射策略中包括源和目標類型的所有公用屬性,也包括在父類上聲明的屬性。
3.2. Adding custom methods to mappers(在映射器中添加自訂方法)
後面添加
第三節MapStruct翻譯--Defining a mapper