Задний план:
У меня есть XPage с несколькими элементами управления, которые связаны с переменными viewScope. При нажатии кнопки push я запускаю вызов java-метода, который будет обновлять/вставлять в DB2 с использованием JDBC (без спящего режима).
В моем java-методе у меня есть переменная resolver, которая получает дескриптор непосредственно для просмотраScope для доступа к данным. На карте viewScope все данные хранятся как объект, а затем вы должны использовать для использования методы класса java.sql.PreparedStatement. Я использую это, потому что параметры добавляются в подготовленный оператор вместо SQL. SQL имеет вопросительные знаки (?), Где добавлена зависимость. (Это делается для безопасности - политика компании).
Вот простой пример:
ps = c.prepareStatement(sql);
ps.setString(1, (String) viewScope.get("firstName"));
Подготовленный оператор имеет специальные методы для каждого типа данных. Если тип данных неверен, вы получаете исключение.
Проблема:
На моем XPage у меня есть два числовых поля редактирования. Они идентичны, оба используют числовой преобразователь, установленный в валюте. Оба имеют значение только целое. Когда я пытаюсь обновить один, он хранится как Long, а другой - как Integer. Вот как я определил, что:
System.out.println("NSA object type=" + viewScope.get("manageNSA").getClass().getName());
System.out.println("PNSAC object type=" + viewScope.get("managePNSAC").getClass().getName());
Результат файла журнала
02/02/2015 05:45:42 PM HTTP JVM: NSA object type=java.lang.Long
02/02/2015 05:45:42 PM HTTP JVM: PNSAC object type=java.lang.Integer
Где не удается:
ps.setInt(2, (Integer) viewScope.get("manageNSA"));
Он также терпит неудачу во втором, если у меня есть этот код.
ps.setLong(6, (Long) viewScope.get("managePNSAC"));
Исключительные следы:
java.lang.ClassCastException: java.lang.Long incompatible with java.lang.Integer
java.lang.ClassCastException: java.lang.Integer incompatible with java.lang.Long
Мой вопрос:
Как в XPages я могу заставить числовые поля всегда быть множеством как longs?? Или как я могу заставить тип к тому, что я хочу, double, long, int и т.д.???
То, что я пробовал:
Отбрасывание обоих в Long не работает, что не имеет смысла. Я знаю, что у меня может быть инструкция if
в моей java, которая сначала проверяет тип, а затем вызывает соответствующий метод, но я бы предпочла заставить XPages устанавливать тип один и тот же каждый раз.
Вы всегда можете создать значение Long и установить его в переменную области с помощью
viewScope.managePNSAC = java.lang.Long.valueOf(yourValue);
Попробуйте текстовое поле с номером Dojo. Он позволяет определить тип номера, который он хранит, используя javaType.
Создайте вспомогательный класс с помощью методов String get(String)
и Long getLong(String)
со Long getLong(String)
.
Ваш код будет:
Helper data = new Helper("viewScope");
ps = c.prepareStatement(sql);
ps.setString(1, data.get("firstName"));
...
ps.setLong(6, data.getLong("managePNSAC"));
Конструктор может использовать strig для идентификации привязанной карты (может быть requestScope
или ваш собственный интерфейс, реализующий Map).
Попробуйте бросить на двойной. Я ДУМАЮ, что вам нужно пройти это сначала. Предполагая, что работы затем преобразуются в Long или int оттуда. Я не уверен... но моя кишка говорит, что вам нужно пройти двойную работу с интерфейсом xpages.
== редактировать
Еще одна вещь, которую вы могли бы попробовать - сначала установить var...
var myVar: java.lang.Double = document1... независимо
viewScope.put("myVar", myVar)
Что-то вроде этого, может быть...
Используйте общий тег конвертера и укажите конвертер, который вы хотите использовать:
<xp:this.converter>
<xp:converter converterId="javax.faces.Integer" />
</xp:this.converter>
<xp:this.converter>
<xp:converter converterId="javax.faces.Long" />
</xp:this.converter>
<xp:this.converter>
<xp:converter converterId="javax.faces.Double" />
</xp:this.converter>
и т.д...
DDE не делает ничего, чтобы помочь обнаруживать вещи, которые встроены и поставляются с средой XPS, наследуемой от JSF.