Как проверить список в Struts 2 с условием? (Выражения проверки)

#xml #validation #struts2 #expression #ognl

#xml #проверка #struts2 #выражение #ognl

Вопрос:

Используя выражения, я пытаюсь убедиться, что либо в списке есть хотя бы один объект (не пустой), либо флажок установлен как true… Кажется, ничего из того, что я пробовал, не работает.

В моем XML-файле проверки я попробовал следующее…

Это все время возвращает false, что приводит к ошибке, даже если список не пуст:

     <validator type="fieldexpression">
       <param name="fieldname">uploads</param>
       <param name="expression">chkAtch eq true or <![CDATA[uploads.length > 0]]></param>
       <message key="validation.atch.present" />
    </validator>
  

Это приводит к тому же, что и выше:

 <param name="expression">chkAtch eq true or uploads.length > 0</param>
  

Как это:

 <param name="expression">chkAtch eq true or uploads not in {null, ""}</param>
  

Это возвращает true все время, но будет отображаться сообщение об ошибке, если присутствуют какие-либо ошибки в полях:

 <validator type="expression">
    <param name="expression">chkAtch eq true or uploads.length > 0</param>
    <message key="validation.atch.present" />
</validator>
  

Есть идеи о том, как я могу убедиться, что либо флажок установлен (TRUE), либо список загрузок заполнен хотя бы одним объектом?

Спасибо,

Редактировать:

Мой JSP:

     <s:file label="File 1" id="file1" name="uploads[0].upload" /> <s:checkbox name="uploads[0].refFile" />
    <s:file label="File 2" id="file2" name="uploads[1].upload" /> <s:checkbox name="uploads[1].refFile" />

<!-- omitted - labels and cosmetics -->
    <s:checkbox name="chkAtch">amp;nbsp;
         <!-- label -->
    </s:checkbox>
  

РЕДАКТИРОВАТЬ 2:

Соответствующие фрагменты из action class:

    private Boolean chkAtch;
   private List<LinguisticFile> uploads;

   public String confirmInput() throws Exception {
        if (hasFieldErrors()) {
            LOG.debug("[confirmInput] has field errors");
            return createInput();
        }
   // Irrelevant code omitted
   ArrayList<AtchObj> atchObj = new ArrayList<AtchObj>();
        if (uploads != null) {
            for (int i = 0; i < uploads.size(); i  ) {
                if (uploads.get(i).getUpload() == null)
                    continue;
                AtchObj atchmnt = new AtchObj(uploads.get(i)
                        .getUploadFileName(),//
                        uploads.get(i).getUploadContentType(),//
                        uploads.get(i).getUpload(),//
                        uploads.get(i).getRefFile()//
                );
                atchObj.add(atchmnt);
            }
        }
    //Irrelevant code omitted
    return "success";
    }

    // Getters and Setters

    public static class LinguisticFile {
        private File upload;
        private String uploadFileName;
        private String uploadContentType;
        private Boolean refFile;

        public File getUpload() {
            return upload;
        }

        public void setUpload(File file) {
            this.upload = file;
        }

        public String getUploadFileName() {
            return uploadFileName;
        }

        public void setUploadFileName(String fileFileName) {
            this.uploadFileName = fileFileName;
        }

        public String getUploadContentType() {
            return uploadContentType;
        }

        public void setUploadContentType(String fileContentType) {
            this.uploadContentType = fileContentType;
        }

        public Boolean getRefFile() {
            return refFile;
        }

        public void setRefFile(Boolean refFile) {
            this.refFile = refFile;
        }
    }
  

Еще одно быстрое редактирование:

Я должен отметить, что все остальное работает для этого проекта, включая другие средства проверки выражений xml.. просто кажется, что я не могу правильно ссылаться на этот список в выражении.

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

1. Разница в том, что одно является выражением поля, а другое — просто выражением

Ответ №1:

Поскольку вы используете список, попробуйте приведенное ниже выражение. length используется для массивов. not in в вашем случае всегда возвращается true, поэтому второе выражение является допустимым.

 <param name="expression"><![CDATA[chkAtch eq true or uploads.size > 0]]></param>
  

или

 <param name="expression"><![CDATA[chkAtch eq true or not uploads.isEmpty]]></param>
  

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

1. Спасибо, я попробую.

2. ХОРОШО, я сделал оба выстрела, и это все еще вызывает у меня проблемы (это не вызывает ошибку). Я обновлю свой вопрос и добавлю свой JSP.

3. Почему ваш класс статичен? Это внутренний класс?

4. Да, этот класс существует в моем классе действий.

5. Вы должны сделать его нестатическим общедоступным классом в отдельном файле.