Отображение Enum для формирования элементов с использованием struts2

Я пытаюсь создать форму, которая содержит переключатель, который отображается на класс, который расширяет 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', имя 'clientStatus.status': Запрошенный ключ списка 'clientStatus.status' не может быть разрешен как тип коллекции / массива / карты / перечисления / итератора, Пример: люди или люди.{Имя}

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

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

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

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

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

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

1 ответ

Решение

Пересмотренный ответ

Когда сообщение об ошибке гласит:

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

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

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

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

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

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

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

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

Другие вопросы по тегам