Java类型转换,其中类型在运行时才知道

时间:2010-09-26 01:46:12

标签: java reflection dynamic type-conversion

我正在尝试为AJAX Web项目编写数据访问层。此DAL必须将通过AJAX servlet传入的数据转换为可传递给PreparedStatement以供执行的对象。

使用HttpServletRequest.getParameter(...)检索的AJAX servlet中的数据以字符串形式出现。

在每个数据类中,我有一组已知的字段及其数据类型,例如: CustomerId(整数),CustomerName(字符串)。

我当然可以在Customer类中编写一个方法来处理转换,但这意味着我必须为每个数据对象的类执行此操作。我宁愿有一个转换的通用方法,例如

Object convert(String value, Class<?> targetType) { ... }

有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:2)

使用您想要使用的所有转换方法创建一个实用程序类。在其静态初始化程序中,使用反射通过参数类型和返回类型在地图中收集所有这些方法。然后,在convert()方法中,只选择适合给定源和目标类型的方法并调用它。使用泛型将返回类型修复为与目标类型相同:

public static <T> T convert(Object from, Class<T> to) 

您可以在this article中找到一个示例。


但正如bmargulies指出的那样,JSON也是一个有趣的选择。您可以让ajax将所有参数作为一个JSON字符串发送。然后,您可以使用JSON-to-Javabean转换器(如Google Gson)将JSON字符串转换为像Customer这样的完整Javabean。它将如此简单:

String jsondata = request.getParameter("jsondata");
Customer customer = new Gson().fromJson(jsondata, Customer.class);
// ...

另见this answer另一个例子。

答案 1 :(得分:1)

有JSON库可以进行数据类型转换。杰克逊是一个。或者,您可以使用JAX-RS服务框架而不是原始servlet对整个思想进行编码,它将为您处理所有这些问题。 Apache CXF是一个包含此支持的框架。由于您要求使用通用解决方案,为什么不使用已经存在的解决方案。

答案 2 :(得分:0)

我们在实用程序类中使用过多的静态转换器来做这件事。它不优雅,但确实简单有效。

class Util {
    public static Long StringToLong(String s) { ... }
    public static Integer StringToInt(String s) { ... }
    public static Date StringToDate(String s) { ... }
    public static Date StringToDateYYMMDD(String s) { ... }
    public static BigDecimal StringToBigDecimal(String s) { ... }
    // etc ad naseum
}

答案 3 :(得分:0)

由于您想要使用PreparedStatement中的参数,为什么还要转换它们呢?

使用setString(index, parameter) SQL时,很乐意为您进行转换。

因此,您可能想要做的唯一事情是某种验证输入确实有效(或者您甚至可以将此部分留给您的SQL引擎,如果它不理解您将抛出异常。