2017-07-19 6 views
1

角度日付ピッカーを使用して、MVCコントローラにISO日付/ 時間のJavascript Dateオブジェクトを使用して日付を送信しています。ジャパンがISO DateTimeからJoda LocalDateを逆シリアル化する

デシリアライズ時には、java.util.Dateのように動作し、レコードを挿入するときには、Dateの時間をカットすることがHibernateで気になります。

今、私はjava.util.Dateからorg.joda.time.[APPROPRIATE_CLASS_HERE]に移行しています。このデシリアライズの問題に直面しています。

DateTimeを私のDTOsに強制すると、ジャケットは正しく逆シリアル化されますが、ターゲットタイプが日付のときは時間情報を削除することをお勧めします。

など。

public class UserDto { 

    private LocaLDate passwordExpirationDate; 

} 


{ 
    "username":"9493", 
    "completeName":"ljdjf", 
    "email":"[email protected]", 
    "cultureId":"IT", 
    "enabled":false, 
    "passwordExpirationDate":"2017-07-13T10:00:00.000Z", 
    "accountExpirationDate":"2017-07-20T10:00:00.000Z" 
} 

代わりに、私はこれを取得:

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Invalid format: "2017-07-13T10:00:00.000Z" is malformed at "T10:00:00.000Z"; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Invalid format: "2017-07-13T10:00:00.000Z" is malformed at "T10:00:00.000Z" (through reference chain: it.phoenix.web.data.dtos.admin.profile.UserDTO["passwordExpirationDate"]) 
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:244) ~[spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Invalid format: "2017-07-13T10:00:00.000Z" is malformed at "T10:00:00.000Z" (through reference chain: it.phoenix.web.data.dtos.admin.profile.UserDTO["passwordExpirationDate"]) 
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:388) ~[jackson-databind-2.8.9.jar:2.8.9] 
Caused by: java.lang.IllegalArgumentException: Invalid format: "2017-07-13T10:00:00.000Z" is malformed at "T10:00:00.000Z" 
    at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900) ~[joda-time-2.9.9.jar:2.9.9] 
    at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:844) ~[joda-time-2.9.9.jar:2.9.9] 
    at com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer.deserialize(LocalDateDeserializer.java:39) ~[jackson-datatype-joda-2.8.9.jar:2.8.9] 
    at com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer.deserialize(LocalDateDeserializer.java:15) ~[jackson-datatype-joda-2.8.9.jar:2.8.9] 
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:504) ~[jackson-databind-2.8.9.jar:2.8.9] 
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:104) ~[jackson-databind-2.8.9.jar:2.8.9] 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:357) ~[jackson-databind-2.8.9.jar:2.8.9] 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:148) ~[jackson-databind-2.8.9.jar:2.8.9] 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814) ~[jackson-databind-2.8.9.jar:2.8.9] 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2938) ~[jackson-databind-2.8.9.jar:2.8.9] 
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:241) ~[spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE] 
    ... 92 more 

質問は次のとおりです。ジャクソンは、単にデフォルト/現在のタイムゾーンの時刻部分をストリッピングすることによりジョダLocalDateにDateTimeオブジェクトをデコードできるように、スマートな方法があります?

注: - 私はすでにジャクソンジョダモジュールの依存関係 を持っている - ジャクソンは2.8.9 ある - 私は私がjava.timeもの(ジャクソンJSR310とは、このような問題を持っていない、関連するJava 8のプロジェクトでJava 7を使用するように強制していますモジュール)

答えて

1

私のSpringコンテキスト構成

<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" id="pnxObjectMapper"> 
    <property name="deserializersByType"> 
     <map key-type="java.lang.Class"> 
      <entry> 
       <key> 
        <value>org.joda.time.LocalDate</value> 
       </key> 
       <bean class="com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer"> 
        <constructor-arg> 
         <util:constant static-field="com.fasterxml.jackson.datatype.joda.cfg.FormatConfig.DEFAULT_DATETIME_PARSER" /> 
        </constructor-arg> 
       </bean> 
      </entry> 
     </map> 
    </property> 
</bean> 

説明に私に働いていた以下のとおりです。当然ISO日付のみの形式を採用LocalDateのためのデシリアライザを定義JodaModuleを、ロードする前に、私は変更する春を強制シリアライザを構築する際のフォーマッタ

1

エラーメッセージによると、日付/時刻入力は2017-07-13T10:00:00.000Zになり、デフォルトではLocalDateは処理できません。

あなたはLocalDateフィールドにcom.fasterxml.jackson.annotation.JsonFormatアノテーションを使用することによって、このフォーマットを設定できるの:

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ") 
private LocalDate passwordExpirationDate; 

これは、ジャクソンが正しく日付を解析ようになります。

+0

どれでもチャンスを動作するはずです後

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setObjectMapper(objectMapper()); // Configuration class @Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(mappingJackson2HttpMessageConverter()); } 

メッセージコンバータ春Configであることを置きますか? –

+0

また、提案されたソリューションのテストが終了しました。私は答えとして投稿します。 LocalDateタイプのすべてのプロパティに上記を適用するのを手伝ってもらえれば、私は解決策が気に入らないので、受け入れられた答えをあなたに授与します。 –

+0

jacksonをどのように設定しますか?'ObjectMapper'を手動で作成するか、Angular固有の設定ファイルを使って設定しますか? –

0

ObjectMapperを作成すると、いくつかのモジュールを登録することができます。

public ObjectMapper objectMapper() { 
    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    objectMapper.registerModule(new JavaTimeModule()); 
    objectMapper.registerModule(new JodaModule()); 
    return objectMapper; 
} 

そして、それは、この世界的な... EHM ...クラスパス全体を適用する

関連する問題