报错的代码:
private List<java.io.File> file;
private List<String> fileFileName;
private List<String> fileContentType;
public List<java.io.File> getFile() {
return file;
}
public void setFile(List<java.io.File> file) {
this.file = file;
}
public List<String> getFileFileName() {
return fileFileName;
}
public void setFileFileName(List<String> fileFileName) {
this.fileFileName = fileFileName;
}
public List<String> getFileContentType() {
return fileContentType;
}
public void setFileContentType(List<String> fileContentType) {
this.fileContentType = fileContentType;
}
后台错误:
ognl.MethodFailedException: Method "setFileContentType" failed for object com.bjsxt.action.UploadAction@ee25db [java.lang.NoSuchMethodException: setFileContentType([Ljava.lang.String;) ]
java.lang.NoSuchMethodException: setFileContentType([Ljava.lang.String;)
警告: Error setting value
ognl.MethodFailedException: Method "setFileFileName" failed for object com.bjsxt.action.UploadAction@ee25db [java.lang.NoSuchMethodException: setFileFileName([Ljava.lang.String;) ]
java.lang.NoSuchMethodException: setFileFileName([Ljava.lang.String;)
分析&解决 :
Struts2的类型转换是一个非常灵活和好用的功能,Struts2的文件上传也已经简化到了极致。对Struts2 的学习也已经有了一段时间了,Struts2的确很好用,但是他的学习成本却比Struts1高,尤其是对于没有WebWork经验的人。Struts2的理念非常好,继承了Spring的POJO理念,但是由于Struts2封装的太过完美,会导致程序员迷失方向。
这两天在做Struts2的多文件上传,一直遇到一个错误说是xxxFileName和xxxContentType类型转换错误,当我将它该为单文件上传时,却一点没有问题,我知道问题是出在了类型转换错误上,但始终找不到根源的所在,我使用了泛型的List,这个转换不是自动发生的吗,为什么还会报这个错误的呢,找了好久才发现原来我在全局的转换配置文件中注册了如下的全局类型转换器:
java.util.List=com.bettersoft.converter.MyConverter
我将它去掉之后,重新部署运行,成功了。 果然是全局类型转换在作怪,虽然问题解决了,但我觉得这是Struts2的一个bug,类型转换应该在需要转换的时候发生,当我使用了泛型的时候,我觉得全局的类型转换不应该发生。当然这与我的程序也有关系,不应该将集合类型的转换器注册为全局类型转换器。而且在JDK5的情况下,应该尽量使用泛型机制,而不要过分的依赖Strust2的类型转换。
Struts2的学习还在继续,我觉得学习它关键是它的理念,如拦截器,POJO编程思想,输入校验和类型转换。