我正在尝试为AJAX Web项目编写数据访问层。此DAL必须将通过AJAX servlet传入的数据转换为可传递给PreparedStatement以供执行的对象。
使用HttpServletRequest.getParameter(...)检索的AJAX servlet中的数据以字符串形式出现。
在每个数据类中,我有一组已知的字段及其数据类型,例如: CustomerId(整数),CustomerName(字符串)。
我当然可以在Customer类中编写一个方法来处理转换,但这意味着我必须为每个数据对象的类执行此操作。我宁愿有一个转换的通用方法,例如
Object convert(String value, Class<?> targetType) { ... }
有人能指出我正确的方向吗?
答案 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引擎,如果它不理解您将抛出异常。