【问题标题】:Storing Java Classes in Database and then Casting to them将 Java 类存储在数据库中,然后转换为它们
【发布时间】:2017-11-14 23:00:02
【问题描述】:

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

问题:如何在不知道它是 Long.class 的情况下将“1234”之类的值转换为 Long.class。我不想硬编码一堆 if-else 块,因为如果我需要向我的数据库添加一个新类,我将需要更改代码以支持它。

伪:

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 中定义的任何类做到这一点?

【问题讨论】:

    标签: java validation generics


    【解决方案1】:

    你可以使用Class.forName(&lt;Attribute Data Type&gt;); 然后调用该类的构造函数的字符串版本来创建对象的新实例。这仅在您使用的类具有 String 构造函数(Long 和 String 有 - 但 Character 没有)时才有效。

    您需要将属性值作为 varchar 存储在数据库中吗?不能存储序列化的 Java 对象吗?然后你可以直接从数据库中反序列化它,你已经创建了正确的对象。

    【讨论】:

    • 您是说将属性值存储为 JSON,以便我可以使用 GSON 库或类似库进行转换吗?我认为这种方法可能适用于自定义对象,但不适用于 Long 和 String 等原始类。
    • 不,作为序列化的 Java 对象(因此它们将是数据库中的 blob 字段)。这是一个示例(外部网站)javapapers.com/core-java/…
    • 谢谢。我去看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2010-10-30
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2016-07-13
    相关资源
    最近更新 更多