Как управлять числовым типом значения, привязанного к переменной области в XPages

1

Задний план:

У меня есть 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 устанавливать тип один и тот же каждый раз.

Теги:
xpages

5 ответов

1
Лучший ответ

Вы всегда можете создать значение Long и установить его в переменную области с помощью

viewScope.managePNSAC = java.lang.Long.valueOf(yourValue);
  • 0
    Я попытался сделать это с помощью этого кода: var managePNSAC: String = @Text (viewScope.managePNSAC); var manageNSA: String = @Text (viewScope.manageNSA); viewScope.managePNSACLong = java.lang.Long.valueOf (managePNSAC); viewScope.manageNSALong = java.lang.Long.valueOf (manageNSA); и это дает мне эту ошибку: java.lang.Integer несовместим с java.lang.Long
  • 0
    Проигнорируйте это сейчас, пожалуйста.
Показать ещё 6 комментариев
1

Попробуйте текстовое поле с номером Dojo. Он позволяет определить тип номера, который он хранит, используя javaType.

  • 0
    Хорошее предложение, я пойду сюда, если я не смогу починить Кнута.
1

Создайте вспомогательный класс с помощью методов 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).

  • 0
    Спасибо за Ваш ответ. Мне кажется, это больше проблем, чем спрашивать объект, какой тип в операторе if. Я держусь за решение, где я могу установить его из XPages.
  • 0
    Я думаю, что вы просите слишком много. Вспомогательный подход будет поддерживать ваш код согласованным.
Показать ещё 2 комментария
1

Попробуйте бросить на двойной. Я ДУМАЮ, что вам нужно пройти это сначала. Предполагая, что работы затем преобразуются в Long или int оттуда. Я не уверен... но моя кишка говорит, что вам нужно пройти двойную работу с интерфейсом xpages.

== редактировать

Еще одна вещь, которую вы могли бы попробовать - сначала установить var...

var myVar: java.lang.Double = document1... независимо

viewScope.put("myVar", myVar)

Что-то вроде этого, может быть...

  • 0
    Я не могу выяснить, как значение устанавливается в XPages viewScope. Один раз он устанавливается как Integer, один раз как Long. Я попробую, но я на 99% уверен, что получу такое же исключение.
  • 0
    Невозможно привести к удвоению: java.lang.Long несовместимо с java.lang. Double
Показать ещё 5 комментариев
0

Используйте общий тег конвертера и укажите конвертер, который вы хотите использовать:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню