Преобразование типов Java, где типы не известны до времени выполнения - PullRequest
1 голос
/ 26 сентября 2010

Я пытаюсь написать слой доступа к данным для веб-проекта AJAX. Этот DAL должен преобразовывать данные, поступающие через сервлет AJAX, в объекты, которые могут быть переданы в PreparedStatement для выполнения.

Данные в сервлете AJAX, полученные с помощью HttpServletRequest.getParameter (...), поступают в виде строк.

В каждом классе данных у меня есть известный набор полей, а также их типы данных, например, CustomerId (целое число), CustomerName (строка).

Конечно, я могу написать метод в классе Customer для обработки преобразования, но это означает, что я должен сделать это для каждого класса объекта данных. Я бы предпочел использовать универсальный метод преобразования, например,

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

Кто-нибудь может указать мне правильное направление?

Ответы [ 4 ]

2 голосов
/ 26 сентября 2010

Создайте служебный класс со всеми методами преобразования, которые вы хотели бы использовать. Внутри статического инициализатора используйте отражение, чтобы собрать все эти методы по типу параметра и типу возврата в карте. Затем в методе convert() просто выберите метод, который подходит для данного источника и целевого типа, и вызовите его. Используйте универсальные шаблоны, чтобы исправить тип возвращаемого значения, совпадающий с целевым типом:

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

Вы можете найти пример в этой статье .


Но, как указал bmargulies, JSON также является интересным вариантом. Вы можете разрешить ajax отправлять все параметры в виде одной строки JSON. Затем вы можете использовать конвертер JSON в Javabean, например Google Gson , чтобы преобразовать строку JSON в полноценный Javabean, такой как Customer. Это будет так же просто, как:

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

См. Также этот ответ для другого примера.

1 голос
/ 26 сентября 2010

Существуют библиотеки JSON, которые будут выполнять преобразование типов данных. Джексон один. Или вы можете написать весь код, используя сервисную среду JAX-RS вместо необработанного сервлета, и он позаботится обо всем этом за вас. Apache CXF - это один фреймворк, содержащий эту поддержку. Поскольку вы просите общее решение, почему бы не использовать уже существующее.

0 голосов
/ 21 декабря 2010

Поскольку вы хотите использовать параметры в PreparedStatement, зачем вообще их преобразовывать?

При использовании setString(index, parameter) SQL будет рад сделать преобразование для вас.

Таким образом, единственное, что вы можете захотеть сделать, - это какая-то проверка того, что ввод действительно действителен (или вы могли бы даже оставить эту часть вашему движку SQL, который выдаст исключение, если он вас не понимает.

0 голосов
/ 26 сентября 2010

Мы делаем эту точную вещь, используя множество статических преобразователей в служебном классе.Это не элегантно, но, конечно, легко и эффективно.

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
}
...