Отображение Enum для формирования элементов с использованием struts2 - PullRequest
4 голосов
/ 03 марта 2011

Я пытаюсь создать форму, которая содержит переключатель, который отображается на класс, который расширяет java.lang.Enum.

<s:form action="corp_low_save">
  <s:textfield label="Corporate Client Name" name="name"/>
  <s:radio list="clientStatus.status" name="clientStatus.status"/>
  <s:textfield label="Primary Address Street" name="primaryAddress.street"/>  
  <s:submit />
</s:form>

Действие реализует ModelDriven и создает новый экземплярследующий объект, доступный через getModel ():

public class com...Customer extends java.lang.Object{
    protected java.lang.String name;
    protected com...ClientStatus clientStatus;
    protected com...Address primaryAddress;
    public com...Customer();
    public java.lang.String getName();
    public void setName(java.lang.String);
    public com...ClientStatus getClientStatus();
    public void setClientStatus(com...ClientStatus);
    public com...Address getPrimaryAddress();
    public void setPrimaryAddress(com...Address);
}

Вот остальные соответствующие классы.Все они были сгенерированы JAXB:

public class com...ClientStatus extends java.lang.Object{
    protected com...StatusString status;
    protected javax.xml.datatype.XMLGregorianCalendar since;
    protected java.lang.String business;
    public com...ClientStatus();
    public com...StatusString getStatus();
    public void setStatus(com...StatusString);
    public javax.xml.datatype.XMLGregorianCalendar getSince();
    public void setSince(javax.xml.datatype.XMLGregorianCalendar);
    public java.lang.String getBusiness();
    public void setBusiness(java.lang.String);
}

public final class com...StatusString extends java.lang.Enum{
    public static final com...StatusString NEW_CLIENT;
    public static final com...StatusString EXISTING_CLIENT;
    public static final com...StatusString RENEWAL;
    public static com...StatusString[] values();
    public static com...StatusString valueOf(java.lang.String);
    public java.lang.String value();
    public static com...StatusString fromValue(java.lang.String);
    static {};
}

Я получаю эту ошибку:

org.apache.jasper.JasperException: тег 'radio', поле 'list',name 'clientStatus.status': Запрошенный ключ списка 'clientStatus.status' не может быть разрешен как тип коллекции / массив / карта / перечисление / итератор.Пример: люди или люди. {Имя}

Есть идеи о том, в чем может быть проблема?

Редактировать: Я думаю, что проблема в том, что ClientStatus имеет значение null,Так как я просто создал экземпляр нового Customer (), его поля пустые.Это облом, потому что он требует, чтобы я закодировал дублирующую информацию в двух частях моей программы.Я могу сделать что-то вроде этого в представлении:

  <s:radio name="clientStatus.status"
       list="#{'NEW_CLIENT':'New Client',
               'EXISTING_CLIENT':'Existing Client',
               'RENEWAL':'Renewal'}"/>

Или в контроллере я должен явно создать поля Customer, которые нужны моему представлению.Это также лишает меня надежды на написание общего действия, которое может обрабатывать все виды объектов JAXB, просто создавая экземпляр данного класса JAXB и делая его доступным через getModel ().

У всех есть идеи о том, как восстановиться после этого.Неудачное положение вещей?

Редактировать 2: Исправлена ​​первая форма, что я ожидал работать.

1 Ответ

1 голос
/ 03 марта 2011

Исправленный ответ

Когда в сообщении об ошибке указано:

не может быть разрешено как коллекция / массив / карта / перечисление / Тип итератора

Это означает java.util.Enumeration, а не перечисление.

При этом вы можете использовать перечисление, вам просто нужно передать массив или коллекциюиз значений, которые вы хотите доступны.Например, ClientStatus.values(), который возвращает массив.

Просто добавьте в свое действие метод получения с именем getClientStatuses, который возвращает массив (или коллекцию) всех значений.

Оригинальный ответ

Атрибут list должен принимать все значения перечисления.В вашем первом примере не похоже, что это происходит.Вместо этого вы предоставляете clientStatus.Разве это не индивидуальное значение перечисления?

В вашем пересмотренном примере вы даете атрибуту list карту, поэтому она работает.

Я обычно выставляю значения перечисления в моемдействие.например, getClientStatuses.

...