Сообщение об ошибке, отображаемое FeedbackPanel, не очищается при действительной отправке ввода в Wicket

#java #wicket

#java #wicket

Вопрос:

У меня есть форма, в которой они являются выпадающим списком и флажком. Когда я не предоставляю никаких входных данных, я получаю сообщение об ошибке, установленное через панель обратной связи, как показано ниже. код

 private Form<ReportCriteria> createCriteriaPanel(String id, IModel<ReportCriteria> model) {
            SelectionForm form = new SelectionForm(id, model);
            ReportCriteria criteria = (ReportCriteria) getDefaultModelObject();
           .......
           FeedbackPanel fb = new FeedbackPanel("feedback");
        fb.setOutputMarkupId(true);
        form.add(fb);
       DropDownChoice<Project> billableProjectsList = new DropDownChoice<>(
                    "projectsList",
                    ......
                    new ChoiceRenderer<Project>("fullNameWithCustomer"));
           
            form.add(billableProjectsList);
            
            CheckGroup<Project> unbillablePrjct = .......
    
            form.add(new FormComponentValidator(billableProjectsList, unbillablePrjct));
            form.getFeedbackMessages().clear();
    }
    
     protected void onSubmit() {
                
               SelectionForm.this.getFeedbackMessages().size());
              TimesheetExportCriteriaPanel.this.SelectionForm.findForm("criteriaForm").getFeedbackMessages();
}
 

все значение feedbackmessages пустое и ничего не возвращает.
Я получаю сообщение об ошибке от FormValidator правильно, когда я не предоставляю никаких входных данных. Когда я предоставляю входные данные и отправляю, форма обновляется и загружается с тем же сообщением об ошибке.

Я хочу, чтобы оно очищалось, когда мы предоставляем допустимый ввод. При проверке на форумах я обнаружил, что для Wicket 6.x нам нужно использовать component.getFeedbackMessages() , но для меня оно пустое.

Я новичок в wicket. Пожалуйста, помогите с вводом.

 public class FormComponentValidator extends AbstractFormValidator {
    private static final long serialVersionUID = 1L;
    private FormComponent<?>[] components;

    @SuppressWarnings("unchecked")
    public FormComponentValidator(FormComponent<?> selectedBillableProject, FormComponent<?> selectedUnBillableProject) {
        components = new FormComponent[]{selectedBillableProject, selectedUnBillableProject};
    }

    /*
     * (non-Javadoc)
     * @see org.apache.wicket.markup.html.form.validation.IFormValidator#getDependentFormComponents()
     */
    public FormComponent<?>[] getDependentFormComponents() {
        return components;
    }

    /*
     * (non-Javadoc)
     * @see org.apache.wicket.markup.html.form.validation.IFormValidator#validate(org.apache.wicket.markup.html.form.Form)
     */
    public void validate(Form<?> form ) {

        if ((org.apache.commons.lang.StringUtils.isEmpty(components[0].getInput()) || components[0].getInput() == null )
                amp;amp; (org.apache.commons.lang.StringUtils.isEmpty(components[1].getInput()) || components[1].getInput() == null)) {

                error(components[0], "project.Required");

            }
        }
    }
 

private void configureFeedback() {

     // activate feedback panel
    final FeedbackPanel feedbackPanel = new FeedbackPanel("feedback");
    feedbackPanel.setOutputMarkupId(true);
    feedbackPanel.setVisible(false);

    add(feedbackPanel);

    // don't show filtered feedback errors in feedback panel
    final int[] filteredErrorLevels = new int[] { FeedbackMessage.ERROR };
    feedbackPanel.setFilter(new IFeedbackMessageFilter() {

        @Override
        public boolean accept(FeedbackMessage message) {

            for (int errorLevel : filteredErrorLevels) {
                if (message.getLevel() == errorLevel) {
                    return false;
                }
            }

            return true;
        }
 

Комментарии:

1. @martin-g , я перепробовал большинство решений, используя Session.getFeedbackMessages () , также FeedbackCollector . Ничего не работает. Пожалуйста, помогите с вашими вводами.

Ответ №1:

При отправке формы Wicket запускает все настроенные средства проверки для всех компонентов FORM (например, TextInput, TextArea, DropDownChoice и т.д.). Если есть ошибка проверки, то сообщение обратной связи связано с соответствующим компонентом FormComponent.

При визуализации панели обратной связи Wicket посещает все Formcontents и отображает их сообщения обратной связи (ошибки, информацию и т. Д.).

В конце цикла запроса Wicket удаляет все отображенные сообщения обратной связи. Если сообщение обратной связи не отображается каким-либо компонентом обратной связи (например, FeedbackPanel), оно останется для следующего цикла запроса. Это делается DefaultCleanupFeedbackMessageFilter .

Поставьте точку останова в DefaultCleanupFeedbackMessageFilter#accept() и посмотрите, принимается ли проблемное сообщение или нет.

Комментарии:

1. — я не понимаю, как реализовать DefaultCleanUpFeedbackMessageFilter . Потому что при загрузке страницы я реализовал — form.add(новый FormComponentValidator(billableProjectsList, unbillablePrjct)); для проверки моего выпадающего списка и флажка . Нужно ли мне что-то добавлять в класс onSubmit?

2. Вам не нужно реализовывать DefaultCleanUpFeedbackMessageFilter. Это фильтр, который Wicket использует по умолчанию. Поместите точку останова в свой метод #accept() и посмотрите, что произойдет. Если оно не вызывается, возможно, один из ваших бывших коллег внедрил пользовательский IFeedbackMessageFilter, который выполняет что-то другое.

3. я добавил точку останова и проверил getRequestCycle(), она не достигает FeedbackMessageFilter . В существующем коде они использовали AjaxFormComponentFeedbackIndicator, расширяющий FormComponentFeedbackIndicator . Но, как я понимаю, это для одной проверки formcomponet за раз.

4. Но мне нужно проверить пустое значение bith DropDownChoice и значение флажка вместе, как я могу использовать это для того же.

5. я не использую AjaxFormComponentFeedbackIndicator , а использую пользовательский класс валидатора, расширяющий AbstractFormValidator . Я передаю оба компонента формы — выпадающий список и значение флажка, выполняя проверку null . Использование тега div с идентификатором обратной связи для отображения сообщения в формате html .