我创建了一个使用JSF和托管bean的简单应用程序。从托管bean我试图实例化一个将数据存储到数据库的spring bean。但是,由于我得到了一个nullPointerExcpetion,“@Autowired”注释似乎不起作用。我阅读了有关如何使用Spring的JSF和托管bean的所有相关主题,但无法解决问题。 也许有人可以查看下面的代码并给我一个提示?
########## ManagedBean ######### @Component @Scope("request") @Qualifier("memberBean") public class ProjectEntityHandlerBean { private List projectList; @Autowired private ProjectBeanLocal projectBean; public ProjectEntityHandlerBean() { } public List getProjectList() { return projectList; } public String getAllProjects() { projectList = projectBean.getAllProjects(); return "true"; }
服务Bean
@Service public class ProjectBean implements ProjectBeanLocal { @PersistenceContext private EntityManager em; /** * Default constructor. */ public ProjectBean() { // TODO Auto-generated constructor stub } @Transactional public List getAllProjects() { System.out.println("ProjectBean invoked"); Query query = em.createQuery("SELECT p FROM Project p"); @SuppressWarnings("unchecked") List projects = query.getResultList(); return projects; }
faces.config.xml
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
<managed-bean>
<managed-bean-name>loginBean</managed-bean-name>
<managed-bean-class>com.example.controller.LoginBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>ProjectEntityHandlerBean</managed-bean-name>
<managed-bean-class>com.example.controller.ProjectEntityHandlerBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
答案 0 :(得分:1)
如果您看到您的配置@component
是春天的日期。您正在ProjectEntityHandlerBean
中设置faces-config.xml
。因此,首先将ProjectEntityHandlerBean
实例化为JSF ManagedBean。
所以,你必须@ManagedProperty
或<managed-property>
将你的服务类注入到这样的JSF托管bean中。在这种特殊情况下,你在faces-config.xml
中定义了你的bean你要注入像这样。
<managed-bean>
<managed-bean-name>ProjectEntityHandlerBean</managed-bean-name>
<managed-bean-class>com.example.controller.ProjectEntityHandlerBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>ProjectBeanLocal</property-name>
<property-class>Qualified path for this class</property-class>
<value>#{projectBeanLocal}</value>
</managed-property>
</managed-bean>
从上述@Autowired
中移除ProjectEntityHandlerBean
。
Important :
您只能使用@Autowired
annoatation将一个Spring Bean注入另一个Spring bean。如果您想将Spring Bean注入JSF Managed Bean或一个JSF ManagedBean如果您使用的是JSF 2.0或更高版本,则使用@ManagedProperty
的另一个JSF ManagedBean;对于jsf 1.2版本,使用<managed-propety>
。
答案 1 :(得分:0)
Srinivas,thnx的帮助。那有用!!!
所以我做的是:
我删除了@Autowire
和
我改变了你提出的faces-config.xml,但有一点不同:
<property-name>projectBean</property-name>
<property-class>Qualified path for this class</property-class>
<value>#{projectBean}</value>
我需要提一下,我使用的是JSF2.0。我使用了<managed-property>
,我无处使用@ManagedProperty。它仍然很好。这是我应该担心的吗?我说的是因为你提到使用JSF2.0或更高版本我应该使用@ManagedProperty
PS:对不起,我将其发布为“asnwer”,但我真的找不到更新原始问题的方法。