JSF页面无法显示CDI Bean属性值的问题求助
JSF页面无法显示CDI Bean变量值的解决方案
问题核心分析
你的代码中存在两个关键问题导致EL表达式无法正确解析Bean变量:
- Bean字段修饰符与Lombok注解不匹配
- 缺少JSF Servlet映射配置,容器未处理JSF页面
解决方案步骤
1. 修正CDI Bean的字段修饰符
Lombok的@Getter和@Setter注解仅会为私有字段生成标准的getter/setter方法。你的patika字段是public类型,Lombok不会为其生成getPatika()方法,而EL表达式#{cdiBean.patika}本质是调用getPatika()方法,而非直接访问字段。
修正后的JsfBean代码:
import jakarta.enterprise.context.RequestScoped; import jakarta.inject.Named; import lombok.Getter; import lombok.Setter; @Named(value = "cdiBean") @RequestScoped @Getter @Setter public class JsfBean { private String patika; // 修改为private字段 public JsfBean() { patika = "Spring Boot Eğitime Hoşgeldiniz"; System.out.println(patika); } }
2. 添加JSF Servlet映射配置
如果web.xml中未配置FacesServlet,容器不会将.xhtml页面交给JSF引擎处理,导致EL表达式无法被解析。需要在web.xml中添加以下配置:
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <welcome-file-list> <welcome-file>index.xhtml</welcome-file> </welcome-file-list> <!-- 新增JSF Servlet映射 --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> </web-app>
3. 验证依赖完整性
确保项目引入了Jakarta EE Web Profile相关依赖(或单独引入CDI API、JSF API及对应实现)。例如Maven项目可添加:
<dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-web-api</artifactId> <version>9.1.0</version> <scope>provided</scope> </dependency>
如果使用Tomcat等轻量级容器,还需额外添加CDI实现(如Weld)和JSF实现(如Mojarra)的依赖,因为Tomcat本身不包含这些组件。
测试验证
重新部署项目后访问index.xhtml页面,即可正常显示Spring Boot Eğitime Hoşgeldiniz文本。
内容的提问来源于stack exchange,提问作者leatred
相关产品推荐
相关产品推荐

