这个问题在这里已有答案:
我创建了一个使用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>
2 回答
如果您看到您的配置
@component
是Spring annoatation . 你正在faces-config.xml
中设置ProjectEntityHandlerBean
. 所以,首先你的ProjectEntityHandlerBean
get实例化为JSF ManagedBean .所以,你必须
@ManagedProperty
或<managed-property>
将你的服务类注入到这样的JSF托管bean中 . 在这种特殊情况下,你在faces-config.xml
中定义了你的bean,你就这样注入了 .从上面的
ProjectEntityHandlerBean
删除@Autowired
.Important : 你只能使用
@Autowired
annoatation将一个Spring Bean注入另一个spring bean . 如果你想将一个Spring Bean注入JSF Managed Bean或一个JSF ManagedBean注入另一个JSF ManagedBean,你使用@ManagedProperty
如果你使用的是JSF 2.0或更高版本或<managed-propety>
对于jsf 1.2版本 .Srinivas,thnx为你的帮助 . 那工作!!!
所以我做的是:我删除了
@Autowire
和我按照你的建议修改了faces-config.xml,略有不同:
我需要提一下,我使用的是JSF2.0 . 我使用
<managed-property>
并且我无处使用@ManagedProperty . 它仍然可以正常工作 . 这是我应该担心的事情吗?我说是因为你提到使用JSF2.0或更高版本我应该使用@ManagedPropertyPS:对不起,我把它发布为“asnwer”,但我真的找不到更新原始问题的方法 .