2016-09-12 33 views
3

我的DTO字符串格式的日期字段。我的實體的日期爲LocalDate。目前我從地圖跳過它,然後手動顯式地設置它(字符串到日期,反之亦然)。Modelmapper將字符串轉換爲LocalDate

它可能自動進行轉換?我嘗試了Spring bean中的Converter,但它給了我很多編譯錯誤(類型Converter不接受參數,不覆蓋convert方法 - 也很多convert()的錯誤)。

@Bean 
public ModelMapper studentModelMapper() { 
....  
    Converter<String, LocalDate> toStringDate = new AbstractConverter<String, LocalDate>() { 
     protected String convert(String source) { 
      return source == null ? null : new LocalDate(source); 
     } 
    }; 
.... 
} 

我對modelmapper不是很熟悉。任何幫助是極大的讚賞。

建議我嘗試用LocalDate for DTO,但問題是當我在前面發送此實體(REST調用)時,我得到以下JSON。

"dateOfBirth": { 
    "year": 1972, 
    "month": "JANUARY", 
    "monthValue": 1, 
    "dayOfMonth": 4, 
    "dayOfWeek": "TUESDAY", 
    "era": "CE", 
    "dayOfYear": 4, 
    "leapYear": true, 
    "chronology": { 
     "id": "ISO", 
     "calendarType": "iso8601" 
    } 
} 

我的前端開發人員需要「YYYY-MM-DD」。

+0

爲什麼不能在你的DTO使用LOCALDATE的? – Cyril

回答

3

如果要轉換爲LocalDate,則需要創建Provider,否則ModelMapper無法實例化LocalDate,因爲它沒有公共默認構造函數。

使用此配置,也將努力:

ModelMapper modelmapper = new ModelMapper(); 

    Provider<LocalDate> localDateProvider = new AbstractProvider<LocalDate>() { 
     @Override 
     public LocalDate get() { 
      return LocalDate.now(); 
     } 
    }; 

    Converter<String, LocalDate> toStringDate = new AbstractConverter<String, LocalDate>() { 
     @Override 
     protected LocalDate convert(String source) { 
      DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 
      LocalDate localDate = LocalDate.parse(source, format); 
      return localDate; 
     } 
    }; 


    modelmapper.createTypeMap(String.class, LocalDate.class); 
    modelmapper.addConverter(toStringDate); 
    modelmapper.getTypeMap(String.class, LocalDate.class).setProvider(localDateProvider); 

我的測試中具有良好的輸出:

String dateTest = "2000-09-27"; 
LocalDate dateConverted = modelmapper.map(dateTest, LocalDate.class); 

System.out.println(dateConverted.toString()); //Output = 2000-09-27