Многопольный преобразователь типа ognl
Вопрос
У меня есть форма с (на данный момент) двумя полями, и я отправляю следующее:
capture.id = 213
capture.description = DescriptionText
Целевой объект 'capture' является неизменяемым, и я хотел бы предоставить преобразователь типов для приема обоих значений и вызова конструктора.Чего я, похоже, не могу сделать, так это вызвать TypeConverter для вызова.
Если входные данные просто:
capture = foo
Затем вызывается преобразователь типов, но, очевидно, от этого мало толку, есть ли способ заставить ognl делегировать мне остальную часть диалога типов, возможно, передавая карту параметров?
Есть какие-нибудь идеи?Возможно ли это вообще в struts2
Версии:стойки 2.0.14 и ognl 2.6.11
Редактировать:Я немного почитал об этом, и моя следующая попытка показалась мне хорошим планом.Моя теория заключалась в том, что использование синтаксиса Map заставило бы Ognl преобразовать значения в map, а затем вызвать мой конвертер с этой картой, чтобы преобразовать его в мое значение.
capture[id] = 213
capture[description] = DescriptionText
Нет, похоже, это вообще не имеет никакого значения.
Решение 2
Похоже, что ответ нет , вы не можете сделать это с помощью struts2.
Я разместил этот вопрос в списке рассылки struts2, и кажется, что невозможно представить несколько полей в TypeConverter
.
В качестве альтернативного решения предлагается использовать изменяемый объект с установщиками, а затем использовать метод «petify» некоторой формы для предотвращения любых будущих изменений.
Для моего проекта я реализовал еще один перехватчик Struts для реализации своего поведения привязки пользовательских параметров.
Другие советы
Способ, которым я это сделал, состоял в том, чтобы иметь следующее в JSP:
<s:textfield name="capture" value="capture.id" />
<s:textfield name="capture" value="capture.description" />
В преобразователе типов параметр String[] values метода ConvertFromString будет содержать оба значения, необходимые для создания нового неизменяемого захвата.При условии, что вы соблюдаете порядок текстовых полей (или, что еще лучше, инкапсулируете его в файл тегов), вы можете использовать индексы массива значений для надежного получения соответствующего поля объекта capture.
Единственная странность в этом подходе заключается в том, что метод convertToString на самом деле ничего не делает для вас.Вы можете вернуть либо id, либо description (или объединить их вместе), но поскольку вы используете атрибут values в JSP, это не имеет значения.