#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. Вы должны сделать его нестатическим общедоступным классом в отдельном файле.