Struts2 Преобразование Enum Array заполняет массив одним нулевым значением - PullRequest
0 голосов
/ 15 июня 2010

Для простого класса действия с этими переменными-членами:

...
private TestConverterEnum test;
private TestConverterEnum[] tests;
private List<TestConverterEnum> tList;
...

И простым перечислением:

public enum TestConverterEnum {
    A,
    B,
    C;
}

Использование преобразования перечисления struts2 по умолчанию, когда я отправляю запрос следующим образом:

TestConterter.action?test=&tests=&tList=&b=asdf

Для test я получаю значение null, которое ожидается.Однако для Array и List я получаю Array (или list) с одним нулевым элементом.Это то, что ожидается?Есть ли способ предотвратить это?

Мы недавно обновили нашу версию struts2, и у нас были собственные конвертеры, которые также не работают в этом случае, поэтому я надеялся использовать метод преобразования по умолчанию.У нас уже есть код, который проверяет эти массивы на null и длину, и я не хочу добавлять еще одно условие к этим ветвям.Есть ли способ предотвратить это поведение?

1 Ответ

2 голосов
/ 16 июня 2010

Да, ожидается поведение IMO.

Параметры Http в принципе многозначны (обычно используются в многозначных списках выбора), поэтому перехватчик параметров struts2 запрашивает (отражением) сеттеры, которые принимают массивы или (в качестве второй опции) одно значение. Ваше действие, вероятно, имеет установщик setTests(TestConverterEnum[] a), поэтому, когда перехватчик Struts2 должен отобразить tests=, он находит этот установщик и думает про себя: «Я должен установить это свойство« tests »с массивом, давайте посмотрим, как передано много параметров ... только один (пустой), тогда давайте создадим массив длины один и заполним его преобразованием ... " и т. д.

Я считаю разумным: ваш запрос содержал один параметр 'tests' (хотя и пустой), поэтому был создан одномерный массив.

Держу пари, что если вы попробуете TestConterter.action?tests=&tests=, будет создан массив длины 2.

Обновлено :

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

Если вы хотите сказать Struts2: «полностью игнорировать пустые параметры» ... Я не думаю (предположим, что это приемлемая идея), это поведение может быть реализовано с помощью некоторой глобальной настройки , Вы всегда можете написать свой собственный перехватчик (или расширить Параметры перехватчик), чтобы он очищал пустые параметры из запроса перед их отображением.

Кстати, обратите внимание, что эта проблема не связана с Enums или Arrays, является полностью общей.

Теперь случай многозначных параметров требует дополнительного рассмотрения. Я предполагаю, что если у вашего Action есть открытое свойство типа array, то это потому, что его можно установить с несколькими параметрами (обычно это SELECT MULTIPLE) - если нет, то здесь есть некоторая проблема проектирования. Каково ваше ожидаемое поведение для этого запроса?

TestConterter.action?tests=&tests=A&tests=&tests=B&tests=B

Должно ли это генерировать массив длиной 5 [null, A, null, B, B] или 3 [A, B, B] или 2 [A, B] или как? Трудно дать общие критерии; Вот почему это лучше всего рассматривается в вашем методе сеттера.

...