Spring MVC集成PrimeFaces项目添加ContextLoaderListener后出现404错误解决方案
问题原因与解决方案
核心错误点
- Servlet映射冲突
当前你将DispatcherServlet的url-pattern配置为/,会接管所有Web请求,优先级高于FacesServlet的*.xhtml映射,导致所有XHTML页面请求被Spring MVC拦截,无法交给JSF引擎渲染,直接返回404。
解决方案二选一:- 修改
DispatcherServlet的映射规则,仅用于处理后端接口请求,不占用根路径,例如改为/api/*或者*.do,页面渲染完全交给FacesServlet - 若必须保留
DispatcherServlet根路径映射,需在Spring配置文件中添加<mvc:default-servlet-handler/>,让Spring MVC将无法匹配的请求交还给容器默认Servlet处理。
- 修改
- web.xml语法错误
你的RequestContextListener配置多写了一个</listener>闭合标签,会直接导致Web应用上下文加载失败,Tomcat无法正常部署项目。
修正后的配置如下:<listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> - 缺少Spring MVC视图解析器配置
你的控制器返回login、view这类逻辑视图名,但未配置对应视图解析器,Spring MVC默认会查找后缀为.jsp的文件,你使用的.xhtml文件自然无法被匹配到。
解决方案:在/WEB-INF/spring/spring.xml中添加如下配置:<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 修改为你实际存放XHTML文件的目录路径 --> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".xhtml"/> </bean> - 版本不兼容问题
你使用的是JSF 2.3规范,但web.xml指定的是Servlet 2.5版本,两者版本不匹配会导致JSF功能异常。建议将web.xml升级为Servlet 4.0及以上版本,适配JSF 2.3的要求。
额外优化建议
- 你当前的架构混用了Spring MVC的控制器页面跳转和JSF的导航规则,职责重叠容易出问题。如果是用PrimeFaces/JSF做前端渲染,不需要用Spring MVC控制器返回页面视图,直接访问
.xhtml路径走FacesServlet即可,Spring仅负责托管业务Bean,通过你已经配置的SpringBeanFacesELResolver给JSF页面注入Bean使用即可。 - 若配置后PrimeFaces的静态资源(CSS、JS、组件资源)加载异常,在Spring配置文件中添加
<mvc:resources mapping="/javax.faces.resource/**" location="/javax.faces.resource/"/>放行JSF静态资源即可。 - 检查
login.xhtml文件是否存放在web根目录,或者上面视图解析器prefix属性配置的对应路径下,确保文件路径正确。
内容的提问来源于stack exchange,提问作者tabusharkh
相关产品推荐
相关产品推荐

