Скрытое поле становится пустым при связывании его в полоску действий - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть страница действий полосы.и когда страница загружается, я хочу сохранить originalAssignee, назначив его из объекта (то есть, setOriginalAssignee (userAction.getAssignee ())), чтобы в случае, если изменился уполномоченный поля объекта, я выполнил некоторые вычисления.Вот мой бин действия:

@UrlBinding("/action/view-details.page")
public class ActionListViewPage extends CustomAction {
.
.
.
private static final String ACTION_LIST_VIEW = "/action/view-details.jsp";
private static final String ACTION_HOME_PAGE="/action/dashboard.page";
private SecurityPerson originalAssignee;
private UserAction userAction;

    public UserAction getUserAction() {
        return userAction;
    }

    public void setUserAction(UserAction userAction) {
        this.userAction = userAction;
    }

    public SecurityPerson getOriginalAssignee() {
        return originalAssignee;
    }

    public void setOriginalAssignee(SecurityPerson originalAssignee) {
        this.originalAssignee = originalAssignee;
    }

@DefaultHandler
    public Resolution showUserAction() {


        if(userAction==null){
            flash("error", "Can't find the the specified User action." );
           return new RedirectResolution(ACTION_HOME_PAGE);
        }

        setOriginalAssignee(userAction.getAssignee());// This one works fine and assigns the the assignee to originalAssignee for future reference 
        return new ForwardResolution(ACTION_LIST_VIEW);
    }
 public Resolution saveUserAction() {

        try {

            if(!originalAssignee.equals(userAction.getAssignee())){
                userAction.setStatusEnum(StatusEnum.RE_ASSIGNED);
                userAction.setAssignedBy(getCurrentUser(getRequest()));
                userAction.setAssignedTimestamp(new Date());
            }

            if (userAction.getStatusEnum() == null) {
                userAction.setStatusEnum(FinAidActionStatusEnum.UNASSIGNED);
            }


            userAction.save();
            flash("ok", "User Action change has been saved to the database. ");

        }
        catch (Exception e) {

            flash("error", "Error saving UserAction./n " + e.getMessage());
        }
        return new RedirectResolution(ACTION_HOME_PAGE);
    }


}

часть страницы view-details.jsp выглядит следующим образом

<stripes:form beanclass="${actionBean.class}" name="actionListForm" id="actionListForm" method="POST"
                              action="view-details.page?saveUserAction=1"
                              style="padding-left:20px;">
                   **<stripes:hidden name="originalAssignee"/>**

                    <tr>
                        <td align="left"> Assign to:</td>

                        <td align="right">
                            <stripes:select name="userAction.assignee" value="${actionBean.userAction.assignee}"
                                            onchange="$('actionListForm').submit();">
                                <stripes:option value=""> </stripes:option>
                                <stripes:options-collection collection="${actionBean.assigneeList}"
                                                            label="person.name"/>
                            </stripes:select>
                        </td>
                        </br> </br>
                    </tr>
                    <tr>
                        <td>
                            Status:
                        </td>
                        <td>
                            <stripes:select name="userAction.statusEnum" onchange="$('actionListForm').submit();"
                                            value="${actionBean.userAction.statusEnum}">
                                <stripes:option value=""> </stripes:option>
                                <stripes:options-enumeration enum="uiowa.maui.biz.finaid.enums.FinAidActionStatusEnum"/>
                            </stripes:select>
                        </td>

                    </tr>

                    <stripes:hidden name="userAction"/>


                </stripes:form>

Как вы можете видеть из моего кода, я использовал скрытую переменную, чтобы сохранить originalAssignee... но когда вызывается метод saveUserAction, он говорит, что originalAssignee имеет значение null.Я не должен выяснять причину.Есть ли какие-либо изменения, которые я должен внести в разрешение Переадресация или Переадресация?

К вашему сведению: userAction - это постоянный объект спящего режима.Спасибо.

Ответы [ 3 ]

0 голосов
/ 08 апреля 2012

Ваша проблема с преобразованием / форматированием типов.

В протоколе HTTP данные могут быть представлены только в виде строк.Таким образом, все значения HTML-формы должны быть отформатированы как строковые значения, и когда метод установки для компонента действия называется преобразованием типа, необходимо преобразование.Из коробки у Stripes есть конвертеры типа / форматеры для int , long , date etc.

Но логически Stripes не может знать, как форматировать / преобразовывать ваши собственные классы, поэтому вам нужно либо использовать методы получения и установки с использованием строковых значений (или любого другого уже известного типа) и выполнять сопоставление с вашими собственными типами.самостоятельно.Или вам нужно расширить систему преобразования / форматирования типов Stripes, предоставив пользовательские Formatter / TypeConverters и использовать @Validate (converter = UserTypeConverter.class)

См. Также: http://www.stripesframework.org/display/stripes/Binding+Into+Domain+Models и Пакеты http://www.stripesframework.org/display/stripes/Validation+Reference

BTW Stripersist также содержат EntityTypeConverter / EntityFormatter , который будет отображать ваши JPA-сущности.

0 голосов
/ 29 сентября 2016

Причина в том, что стратегия заполнения входного тега Stripes по умолчанию сначала смотрит на параметры запроса, а затем на значения ActionBean:

Выезд https://stripesframework.atlassian.net/wiki/display/STRIPES/Tag+Library+Doc раздел «Входные метки населения и репопуляции»

DefaultPopulationStrategy ищет в следующем порядке первое непустое значение (значения) при заполнении заданного входного тега:

  1. Карта параметров HttpServletRequest для значений, соответствующих имени тег ввода
  2. ActionBean для свойства или вложенного свойства
    соответствие имени входного тега
  3. Значение, указанное тегом
    сам по себе (зависит от тега; обычно как атрибут значения или как тело тега)

Вы можете изменить это поведение в масштабе всей системы, используя BeanFirstPopulationStrategy. Есть также способы ограничить это поведение определенным компонентом: https://stripesframework.atlassian.net/wiki/display/STRIPES/Overriding+PopulationStrategy+per+ActionBean

0 голосов
/ 04 апреля 2012

Это то, что у меня есть, когда я вижу источник

<input type="hidden" value="" name="originalAssignee">

Однако, когда я добавляю "value="${actionBean.originalAssignee}"" к скрытой переменной .. и все работало нормально. Я не знаю, почему оригинальный код не работает, но пока, по крайней мере, он решил проблему.

К вашему сведению: если вы можете сообщить, почему предыдущий не работает, и ваше решение лучше моего, я сделаю ваше решение. Поэтому не стесняйтесь добавлять свой ответ.

...