2017-12-06 4 views
0

私はプロジェクトに参加しました:APIレストという名前のUsuarioとJEEアプリケーションのstoreです。 StoreはUsuario APIから情報を取得します。Javaで日付をシリアライズしてデシリアライズする

すべての情報は、MediaType.APPLICATION_JSON_TYPEを使用して送受信されます。

APIには、次の属性を持つEventoエンティティがあります。Date fecha。 JEEアプリケーションには、Evento Beanがあります。これには、次の属性Date Fechaがあります。

APIがEventoクラスのオブジェクトを送信すると、APIはyyyy-MM-dd HH:mm:{"Date": "2017-12-06 23:02"の形式でDateを送信します。

JEEアプリケーションは、クライアントとWebTargetを使用してAPIを使用して情報を取得します。

ここでの問題は、eventoオブジェクトのfecha(Date型の)がnullであることです。それはうまく非直列化されていません。

私はJEEアプリケーションでSpringを使用できません。ストアアプリケーションでJAX-RSを使用しています。

お願いします。

+0

「ウスアリオAPI」は何ですか?この質問は、無関係な詳細で散らばっているようです。簡単に編集してください。 –

+0

"serialize date java"に451件の検索ヒットがどれもあなたの問題に対処していないことを説明してください。投稿の前に完全にスタックオーバーフローを検索してください。 –

答えて

1

最初にいくつかの事実を明らかにする。しかし私は100%確信していません。

  • JSONの日付または瞬間を表すための標準規則はありません。
    • ミリ秒を使用するものもあれば、ISOZなどの一部をフォーマットしたものもあります。
  • Java EEでのシリアライズ/デシリアライズの標準規則はありません。
    • application/jsonの基本的なメッセージプロバイダとしてのみ機能します。
    • JSON-Bはまだ仕様では使用できないことに注意してください。

のは、我々はこのエンティティがあるとしましょう。

// I really want to know what Evento/fatcha means. 
// Are they Italian words? 
@XmlRootElement 
@Entity 
public class Evento implements Serializable { 

    public Date getFetcha() { 
     return ofNullable(fetcha) 
       .map(v -> new Date(v.getTime())) 
       .orElse(null); 
    } 

    public void setFetcha(final Date fetcha) { 
     this.fetcha = ofNullable(fetcha) 
       .map(v -> new Date(v.getTime())) 
       .orElse(null); 
    } 

    @XmlElement 
    @Temporal(TIMESTAMP) 
    private Date fetcha; 
} 

今、私たちは助けるが、application/jsonに逆シリアル化/シリアル化する基礎となるMessageReaderまたはMessageWriterに依存することはできません。

ジャクソンは何らかの方法で動作しますが、MOXyは動作します。

クライアントをプッシュする唯一の方法は、リソースがGETのリソースの場合とまったく同じ形式を使用することです。

私が使用する1つの方法は、統一された書式設定/解析に別のプロパティを使用することです。

@XmlRootElement 
@Entity 
public class Evento implements Serializable { 

    // ... 

    @JsonProperty 
    @JsonbProperty 
    @XmlElement 
    public String getFetchaIsoz() { 
     return ofNullable(getFetcha()) 
       .map(Date::toInstant) 
       .map(DateTimeFormatter.ISO_INSTANT:format) 
       .orElse(null); 
    } 

    public void setFetchaIsoz(final String fetchaIsoz) { 
     setFetcha(ofNullable(fetchaIsoz) 
       .map(DateTimeFormatter.ISO_INSTANT:parse) 
       .map(Instant::from) 
       .map(Date::from) 
       orElse(null)); 
    } 

    @JsonIgnore // just in case, e.g. Spring? 
    @JsonbTransient 
    @XmlTransient 
    @Temporal(TIMESTAMP) 
    private Date fetcha; 
} 

特定のフォーマットで動作することを保証する代替プロパティはありません。

関連する問題