我正在使用Struts2 2.5.20,并且编写了几乎可以正常工作的文件上传操作。我在调试器中可以看到正在调用setReport(),setReportContentType()和setReportFileName(),并且参数值正确。但是,永远不会调用execute()方法。我尝试按照调用堆栈进行操作,以了解应在何处调用它,但是层接一层的拦截器无法找到底部。
有人知道执行execute()的原因吗?
public class ImportReportAction extends CampaignerActionSupport implements ValidationAware
{
private File report;
private String reportContentType;
private String reportFileName;
@Override
public String execute() throws Exception
{
...
return SUCCESS;
}
public void setReport(
File report)
{
this.report = report;
}
public void setReportContentType(
String reportContentType)
{
this.reportContentType = reportContentType;
}
@RequiredFieldValidator(type = ValidatorType.FIELD, key = "errors.required", messageParams = { "getText('labels.report.file')" })
public void setReportFileName(
String reportFileName)
{
this.reportFileName = reportFileName;
}
}
更新:我发现问题出在具有RequiredFieldValidator批注。如果存在,验证总是会失败,但是s:actionerror标记不会显示任何消息。当注释不存在时,它允许用户不选择文件而仍然调用execute()。
新问题是:如何正确注释我的班级以验证文件上载?
我必须删除@RequiredFieldValidator批注,使我的操作实现ValidationAware,然后实现validate()方法并手动将验证放入其中。