PrimeFaces文件上传与PrettyFaces配合失效问题排查
首先来说文件上传失败的核心问题:你的@BeanPage注解配置错了!
1. 修正@BeanPage注解的映射
@BeanPage的name属性需要对应实际的JSF视图ID(也就是pretty-config.xml里<url-mapping>的<view-id>值),而不是PrettyFaces定义的URL路径(<pattern>的值)。
你一开始的代码:
@BeanPage(name = "/admin/catalogue")
但你的PrettyFaces映射是把/admin/catalogue(URL路径)转发到/page/admin/catalogue.xhtml(实际视图ID),所以正确的注解应该是:
@BeanPage(name = "/page/admin/catalogue.xhtml")
这个错误会导致PrimeFaces的文件上传请求找不到对应的CatalogueBean实例,后台根本没触发imageLoad方法,所以看起来没有报错,但图片完全没上传。
你修改注解后控制台显示admin/catalog(应该是拼写小失误,实际是admin/catalogue),这是PrettyFaces正常的URL重写日志,说明此时请求已经正确关联到视图和Bean了,你可以在imageLoad方法里加个日志打印,确认是否被调用。
2. 验证文件上传过滤器配置
你在web.xml里给PrimeFaces文件上传过滤器添加REQUEST和FORWARD的<dispatcher>配置是正确的,因为PrettyFaces内部会使用请求转发,必须加上FORWARD才能让过滤器处理转发后的文件上传请求,这个配置没问题,不用改。
3. 给adminCatalogue映射设置仅允许GET请求
在PrettyFaces 3.3.3中,你可以通过<restrict>标签限制HTTP方法,只允许GET请求访问这个URL映射:
<url-mapping id="adminCatalogue"> <pattern value="/admin/catalogue" /> <view-id value="/page/admin/catalogue.xhtml" /> <restrict> <http-method>GET</http-method> </restrict> </url-mapping>
这样任何非GET的请求(比如POST)访问/admin/catalogue都会被拒绝。
最后补充一点:如果修改注解后还是有问题,可以检查一下catalogueBean.imageLoad方法的签名是否符合要求——它应该接收FileUploadEvent参数,比如:
public void imageLoad(FileUploadEvent event) { // 你的上传逻辑 }
内容的提问来源于stack exchange,提问作者user3336884

