ユースケース:多数のデータ型に対してユーザー入力を受け入れ、Javaでバックエンドのユーザー入力を検証します。データベースにJavaクラスを格納してからキャストする
データベース:
Table 1 - Attribute Declarations
Id | Attribute Name | Attribute Data Type
-----------------------------------------
1 | My Numeric Type | Long.class
2 | My String Type | String.class
3 | Favorite Letter | Character.class
Table 2 - Attribute Assignments
Id | Fk | Attribute Value [Varchar2]
--------------------------
66 | 1 | 1234
67 | 2 | Some Word
68 | 3 | A
問題:どのように私は、「1234」のような値を取り、それがLong.classだということを知らずにLong.classにそれをキャストします。私はDBの新しいクラスを追加する必要がある場合、それをサポートするためにコードを変更する必要があるため、たくさんのif-elseブロックをハードコードしたくありません。
Pseduo:
public static void validate(final Class<?> dbClass, String attrValue){
try {
dbClass.cast(attrValue);
} catch(Exception e){
LOGGER.error("ERROR: This Attribute Value is not an "
+ "instance of Class: {} | {}", dbClass.getSimpleName(), e);
throw e;
}
}
現在の問題:ロングにキャストすることはできませんjava.lang.Stringでされています。私はこれをLong.parseLong(string)を使って行うことができることを知っていますが、私のDBに定義されているどのクラスに対してもそれを行うことができる一般的な方法はありますか?
GSONライブラリなどを使用してキャストできるように、属性値をJSONとして保存するとしますか?私はこのアプローチがカスタムオブジェクトではうまくいくと思ったが、LongやStringのようなプリミティブなクラスではうまくいかないと思った。 – jDub9
いいえ、シリアル化されたJavaオブジェクトとして(したがって、DBのblobフィールドになります)。ここに例(外部ウェブサイト)http://javapapers.com/core-java/serialize-de-serialize-java-object-from-database/ – IanB
ありがとうございます。私は確認して見ます。 – jDub9