2017-11-14 9 views
0

ユースケース:多数のデータ型に対してユーザー入力を受け入れ、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に定義されているどのクラスに対してもそれを行うことができる一般的な方法はありますか?

答えて

0

Class.forName(<Attribute Data Type>);を使用して、そのクラスのコンストラクタの文字列バージョンを呼び出して、オブジェクトの新しいインスタンスを作成することができます。これは、使用しているクラスにStringコンストラクタ(LongとStringはありますが、Characterではできません)がある場合にのみ機能します。

DBに属性値をvarcharとして格納する必要がありますか?シリアライズされたJavaオブジェクトを保存できませんか?次に、DBから直にデシリアライズするだけで、正しいオブジェクトがすでに作成されています。

+0

GSONライブラリなどを使用してキャストできるように、属性値をJSONとして保存するとしますか?私はこのアプローチがカスタムオブジェクトではうまくいくと思ったが、LongやStringのようなプリミティブなクラスではうまくいかないと思った。 – jDub9

+0

いいえ、シリアル化されたJavaオブジェクトとして(したがって、DBのblobフィールドになります)。ここに例(外部ウェブサイト)http://javapapers.com/core-java/serialize-de-serialize-java-object-from-database/ – IanB

+0

ありがとうございます。私は確認して見ます。 – jDub9

関連する問題