2016-09-12 91 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