12

私の DTO には、文字列形式の日付フィールドがあります。私のエンティティは 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);
        }
    };
....
}

私はモデルマッパーにあまり詳しくありません。どんな助けでも大歓迎です。

提案されているように、DTO の LocalDate を試してみましたが、問題は、このエンティティを前に送信すると (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」が必要です。

4

3 に答える 3

23

に変換する場合は、それ以外の場合はインスタンス化できないLocalDateを作成する必要があります。これは、パブリックのデフォルト コンストラクターがないためです。ProviderModelMapperLocalDate

この構成を使用すると、機能します。

 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
于 2016-09-19T09:36:21.463 に答える