在数据库中存储Java类,然后转换为它们

时间:2017-11-14 14:34:01

标签: java validation generics

用例:接受多种数据类型的用户输入,并使用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

问题:我如何看待像#34; 1234"并将其转换为Long.class而不知道它是Long.class。我不想对一堆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的。我知道我可以使用Long.parseLong(string)来做到这一点,但是我可以为我的DB中定义的任何类做一个通用的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用Class.forName(<Attribute Data Type>); 然后调用该类的构造函数的字符串版本以创建该对象的新实例。这只适用于你使用的类有一个String构造函数(Long和String的作用 - 但是字符没有&#39; t)。

您是否需要将Attribute值存储为数据库中的varchar?你能不存储序列化的Java对象?然后,您可以直接从数据库中对其进行反序列化,并且您已经创建了正确的对象。