Omnifaces 2.x是否兼容JSF 2.3?升级MyFaces遇类转换异常
OmniFaces 2.x与JSF 2.3兼容性及ClassCastException问题解决
首先直接给你结论:OmniFaces 2.x并不完全兼容JSF 2.3,你遇到的这个ClassCastException就是典型的适配问题导致的。
异常原因分析
你看到的报错:
java.lang.ClassCastException: [B cannot be cast to java.base/java.lang.Integer at org.omnifaces.util.Hacks.removeViewState(Hacks.java:432) at org.omnifaces.viewhandler.OmniViewHandler.unloadView(OmniViewHandler.java:134) ...
根源在于OmniFaces 2.x的Hacks类在处理视图状态时,仍然沿用了JSF 2.2及更早版本的逻辑——它期望视图状态的标识是Integer类型,但MyFaces 2.3及更高版本中,视图状态的存储格式发生了变化,部分场景下会以字节数组([B)的形式存在,这就导致了强制转换失败。
可行的解决方案
针对你的场景,有几个选项可以参考:
- 优先升级到OmniFaces 3.x版本:OmniFaces 3.x是专门为JSF 2.3设计的,完全适配MyFaces 2.3及后续版本的内部实现,能彻底解决这类兼容性问题。虽然你提到暂不升级整个Java EE 8栈,但OmniFaces 3.x仅依赖JSF 2.3,不需要完整的Java EE 8环境,在TomEE 7搭配MyFaces 2.3的环境下也能正常运行。
- 临时绕过OmniViewHandler:如果暂时无法升级OmniFaces,可以在
faces-config.xml中配置使用MyFaces原生的视图处理器,绕过OmniFaces的视图处理逻辑:
这样能避免触发这个异常,但会失去OmniFaces视图处理器提供的额外优化特性,比如视图卸载的增强逻辑。<application> <view-handler>org.apache.myfaces.application.ViewHandlerImpl</view-handler> </application> - 尝试OmniFaces 2.x的最新补丁版本:OmniFaces 2.x的维护分支(比如2.7.x系列)针对JSF 2.3做了部分兼容修复,你可以尝试升级到2.7.x的最新版本,看是否能解决这个问题。不过这个系列的修复比较有限,无法覆盖所有JSF 2.3的新特性适配。
总结
OmniFaces 2.x是为JSF 2.2及更早版本设计的,对JSF 2.3的兼容性是有限的,尤其是MyFaces 2.3及更高版本的内部实现变化会导致这类奇怪的类型转换异常。最稳妥的解决方式还是升级到OmniFaces 3.x版本。
内容的提问来源于stack exchange,提问作者cocorossello
相关产品推荐
相关产品推荐

