Angular + Spring Boot + DBFlute環境でのLocalDateTimeの扱い方

131 views
Skip to first unread message

jet

unread,
May 28, 2019, 8:46:21 AM5/28/19
to DBFluteユーザの集い

○質問したいこと

Angular + Spring Boot + DBFlute環境でのLocalDateTimeの扱い方について
クライアントからサーバーへ日付項目を渡したときに
サーバー側で発生するJSONのパースエラーを回避する方法について
対応方法がわかればご教授願えますでしょうか。

○状況

クライアントとサーバーのやり取りのDTOに
SimpleDtoで作成したDTOを使っています。 
クライアント側はFlexDtoで作成したDTOを使っています。

データベースの日付項目はJava側はLocalDateTimeにマッピングしています。

日付項目をAngularからJSON形式でサーバーに送信すると
ISO-8601形式の「"2019-05-15T15:00:00.000Z"」のような値になりますが、 
これをLocalDateTime型に変換する際にパースに失敗してしまいます。


○その他

Angular側の仕様上、日付はISO-8601形式になるため
ここを変更することは難しいと考えています。
 
テーブルと同じレイアウトのDTOをクライアントと共有しながら
java側は自由に変数の型を選びたいということなので、
そもそも無理がある方法なのかもしれません。

DBFluteの内容と離れた質問かと思いますが、よろしくお願いいたします。


○環境

クライアント
 ・Angular 7.2.14
サーバー
 ・Spring Boot 2.1.3 (JSONパーサはJacksonです)
    ・DBFlute 1.2.0-RC2
      (クライアント側はDBFlute 1.2.1-RC1)

   

Y.Watanabe

unread,
May 28, 2019, 9:40:50 AM5/28/19
to dbf...@googlegroups.com
こんばんは。

もしも可能であれば、ですが。

私だったら、DBの定義のほうをタイムゾーン付きの日時型に変えて、
Java側ではOffsetDateTime型を使います。

そうすればいろいろスムーズになります。

angularからの入力をspring mvc のコントローラが受け付けるときの型変換とか、
たぶん
@PostMapping(value = "/hoge")
public String execute(@RequestParam OffsetDateTime inputTimeStamp) {}
でそのまんまangularからの「"2019-05-15T15:00:00.000Z"」を受け取れるんじゃないでしょうか。

DBの種類や定義情報(CREATE TABLE文)が無いのでなんともですが、
mysqlであれば timestamp 型
postgresqlであれば timestamp with timezone型
がよいでしょう。

いまからテーブル定義を変えられるのであれば、ですが。

--------
わたなべ
http://nabedge.mixer2.org
nab...@gmail.com

2019年5月28日(火) 21:46 jet <kisoj...@gmail.com>:
> --
> このメールは Google グループのグループ「DBFluteユーザの集い」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには dbflute+u...@googlegroups.com にメールを送信してください。
> このグループに投稿するには dbf...@googlegroups.com にメールを送信してください。
> https://groups.google.com/group/dbflute からこのグループにアクセスしてください。
> このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/dbflute/aa1ba782-a773-44bb-9ae7-dfa2ac78ce4d%40googlegroups.com にアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

kubo

unread,
May 28, 2019, 11:15:02 AM5/28/19
to DBFluteユーザの集い
jfluteです

jetさん、こんばんは

TImeZone自体を持ってしまうとういソリューションはすでに提示されているので、
自分の方としては、まあ月並みですが、
Jacksonのオプションで"Z"をfilterしちゃうのはどうでしょうか?
(単純にfilterしてつじつま合うかどうかは要検証の上で)

LastaFluteのGsonアダプターではそういったfilterもできるようにしています。
Jacksonでも同様なことができるとは思います。


※この件...何かここ1,2年で別のところで話題になったような記憶が...思い出せない...
DBFluteでは、自動filterしようとして考え直してやめてますね。
https://github.com/dbflute/dbflute-core/blob/3508b660035f50f6ab0b38e6cdcf982b69dd2285/dbflute-runtime/src/main/java/org/dbflute/util/DfTypeUtil.java#L1867

kubo

unread,
May 28, 2019, 11:49:33 AM5/28/19
to DBFluteユーザの集い
jfluteです

> 自分の方としては、まあ月並みですが、
> Jacksonのオプションで"Z"をfilterしちゃうのはどうでしょうか?
> (単純にfilterしてつじつま合うかどうかは要検証の上で)

jetさん、まずは、そのシステムでは、
タイムゾーンの取扱いはどういうポリシーになっているのか?
その辺をまずはっきりさせてからですね。
(DBに入れる日付はどこの時間帯を前提としたものなのか?などなど)

jet

unread,
May 29, 2019, 1:30:37 AM5/29/19
to DBFluteユーザの集い
jflute さま
わたなべ さま

ご回答頂きありがとうございます。

まず、タイムゾーンの扱いですが、このシステムは
国内のみの運用しか想定しておりません。
日付、時間はすべて日本時間となります。
したがって、LocalDateTimeで十分と考えていました。

幸いにも、まだまだ開発初段階であるため
DB変更は自由に行うことができる状態です。

その上で、いろいろ試してみました結果、
SimpleDtoDefinitionMapを修正するだけで
DTOに適切なアノテーションを付与でき
LocalDateTimeのまま対応することができました。

ただ、気になった点として
SimpleDtoDefinitionMapにJsonicDecorateionMapとJacksonDecorationMapがありますが、
JacksonDecorationMapの設定値が無視され、JsonicDecorationMapの値が使用されているように思います。

今回はJsonicDecorationMapの値を修正することで対応できました。 

一度、ご確認いただけますでしょうか。
 
 

kubo

unread,
May 29, 2019, 2:31:02 AM5/29/19
to DBFluteユーザの集い
jfluteです

> その上で、いろいろ試してみました結果、
> SimpleDtoDefinitionMapを修正するだけで
> DTOに適切なアノテーションを付与でき
> LocalDateTimeのまま対応することができました。

おお、自分でも忘れていましたが、
SimpleDTOはJacksonのアノテーションを付与できるように作られてますね。

> SimpleDtoDefinitionMapにJsonicDecorateionMapとJacksonDecorationMapがありますが、
> JacksonDecorationMapの設定値が無視され、JsonicDecorationMapの値が使用されているように思います。

おお、見事にバグってますね。。。m(_ _)m。
vmテンプレートの中の分岐が間違っていました。
添付ファイルのvmファイルを使って試してみてください。
SimpleDtoBaseEntity.vm

jet

unread,
May 30, 2019, 2:19:37 AM5/30/19
to DBFluteユーザの集い

jflute さま

早々にご対応いただきありがとうございます。

頂いたVMファイルで試してみたところ、想定通りDTOが作成されることを確認できました。

当初の問題は解決できました。
Reply all
Reply to author
Forward
0 new messages