※当サイトの記事には、広告・プロモーションが含まれます。

JSONのキーが削除されてる場合にJavaのDTOにデシリアライズを上手くできるんだっけ?

gigazine.net

⇧ IT系の技術的な情報の検索については、品質を改善するのは難しそうな気がしますな...

IT系の技術的な情報については、公式のドキュメントとかもイケてないからして、手の施しようがないという気もするが、頑張って改善して欲しいのだが...

ちなみに、

Google Cloud accidentally deletes UniSuper’s online account due to ‘unprecedented misconfiguration’

https://www.reddit.com/r/sysadmin/comments/1cnw6ix/google_cloud_accidentally_deletes_unisupers/?rdt=53045

Google Cloud側で誤ってUniSuperのアカウントが削除されたらしいのだけど、UniSuper側でサービスのバックアップを取っていたらしく、復元できたということらしい。

クラウドで「事業継続計画(BCP:Business Continuity Plan)」は破綻する可能性もあると...

まぁ、人災であるならば、オンプレミス環境でも起こり得る問題ではありそうなので、サービスのリソースを退避する場所が肝ということですかね。

UniSuper側でバックアップを別のシステムに退避するようにしていた方、偉大過ぎますな。

う~む、クラウドサービスプロバイダーをどこまで信じれば良いものか...

JSONのキーが削除されてる場合にJavaDTOにデシリアライズを上手くできるんだっけ?

とりあえず、Spring Web MVCでバリデーションする際のパターンとして、

  1. Spring Web MVCのコントローラーのメソッドの引数にアノテーションを付けてバリデーションする
  2. Spring Web MVCのコントローラーのメソッドに入ってからでバリデーションする
  3. Service Layerでバリデーションする

の3つがあるのかなと思うのですが、いずれにしろ、外部からリクエストされてきたデータをJavaDTO(Data Toransfer Object)などに変換することで、DTOの各フィールドに付与してるバリデーション用のアノテーションでバリデーションするってのがメジャーな方法なのかなと。

つまり、バリデーションするには、JSONからJavaDTO(Data Toransfer Object)にデシリアライズが必要になってくると。

JSONからJavaDTO(Data Toransfer Object)のデシリアライズの流れのイメージとしては、

stackabuse.com

⇧ 上記サイト様のイメージ図が分かりやすいかと。

上図のJava Objectが、バリデーション用のアノテーションが付与されたDTO(Data Toransfer Object)に該当すると。

で、

qiita.com

⇧ 何やら、JSONのキー自体を削除できてしまいますと。

JSONのキーが削除できるということで、少し気になってくるのが、JSONからJavaDTO(Data Toransfer Object)にデシリアライズする際にエラーとかにならないのかと。

そのあたり、Jacksonが良しなに対応してくれるのかどうかが分からない...

リクエストを受信する側で考慮する問題ではあるのですが、気になったので調べてみることに。

Spring Frameworkのドキュメントを見る限り、

spring.pleiades.io

⇧ Spring Web MVCは、デフォルトでJacksonライブラリが有効になっているらしい。

qiita.com

⇧ 上記サイト様がJacksonによるJSONJavaオブジェクトの相互変換についてまとめてくださっています。

で、

  1. JSONの中に、デシリアライズ後の Java オブジェクトに存在しないプロパティがある場合
  2. JSONの中に、デシリアライズ後の Java オブジェクトに存在するプロパティが無い場合

の内、「1. JSONの中に、デシリアライズ後の Java オブジェクトに存在しないプロパティがある場合」については、

@JsonIgnoreProperties(ignoreUnknown=true)

⇧ 上記のアノテーションJavaDTO(Data Toransfer Object)クラスに付けていれば良いらしい。

で、今回、気になっている「2. JSONの中に、デシリアライズ後の Java オブジェクトに存在するプロパティが無い場合」のケース、つまり、JSONからキー自体が削除されている場合におけるデシリアライズでエラーにならないのか?

これについて、言及しているネットの情報が見当たらないのだけど、Microsoft Copilotの「より厳密に」モードで質問してみたところ、「2. JSONの中に、デシリアライズ後の Java オブジェクトに存在するプロパティが無い場合」のケースについても、

@JsonIgnoreProperties(ignoreUnknown=true)

⇧ の対応でデシリアライズでエラーにならないようにしてくれるという回答だった。

まぁ、実際に動作確認できていないのでMicrosoft Copilotの回答は全く信用できないわけなのだけど、相変わらず、Java関連のドキュメントはカオスだなぁと...

そもそも、IF定義書のフォーマットのままやり取りすれば良いと思うのだけど、非必須な項目で設定される値が無いケースでJSONのキー自体を削除するって方針になるかもしれないということで、JSONのキーがJava DTOのフィールドより少ないケースでデシリアライズでエラーにならないのか調べてはみたものの、これといった情報が見当たらないんだが...

とりあえず、今回、送信する側なので、JSONからのデシリアライズを気にする必要は無いのだけど、JSONのキー自体を削除するケースが一般的なのかどうかが分からない...

毎度モヤモヤ感が半端ない…

今回はこのへんで。