【问题标题】:How to Inject ManagedBeans in JSF2.0如何在 JSF2.0 中注入 ManagedBeans
【发布时间】:2010-07-20 14:46:51
【问题描述】:

我有 Controller-ManagedBeans 和 Model-ManagedBeans(比如 MVC-Pattern)。

这里是我的控制器:

   @ManagedBean
   @RequestScoped
    public class ProjectController {

 private ProjectData projectBean;   //The Model-ManagedBean (see below)!
 private IProjectService projectService;    //My Service-Layer

 public ProjectController(){
  init();
 }

 private void init(){
  projectBean = new ProjectData();
  projectService = new ProjectService();
 }

 public String saveProject() {
  projectService.addProject(projectBean.getProjectDTO());

  return ("");
 }
    }

...你可以看到我的模型,它从 facelet 中获取值...

@ManagedBean(name="ProjectData")
@SessionScoped
public class ProjectData {

 private ProjectDTO projectDTO;

 public ProjectData(){
  projectDTO = new ProjectDTO();
 }

 public ProjectDTO getProjectDTO() {
  return projectDTO;
 }

 public void setProjectDTO(ProjectDTO projectDTO) {
  this.projectDTO = projectDTO;
 }

 public String getTitle() {
  return projectDTO.getTitle();
 }

 public void setTitle(String title) {
  projectDTO.setTitle(title);
 }
}

我现在的问题是它不起作用。我想我需要在这两个类之间注入依赖关系。但是怎么做?有没有 JSF-pro 可以帮助我。 我想使用注释。 谢谢


BalusC 发帖后更新

我稍微更改了我的代码,但它仍然无法正常工作。任何进一步的建议,请。

@ManagedBean(name="projectData")
@SessionScoped
public class ProjectData {

...

@ManagedProperty(value="#{projectData}")
private ProjectData projectData;

错误com.sun.faces.mgbean.ManagedBeanCreationException 表示无法创建控制器bean,因为找不到projectData(模型bean)..

【问题讨论】:

    标签: jsf dependency-injection annotations jsf-2


    【解决方案1】:

    这应该可行:

    @ManagedProperty(value="#{ProjectData}")
    private ProjectData projectBean
    

    也就是说,通常的做法是以小写开头的实例名称。你也没有真正做到

    ProjectData ProjectData = new ProjectData();
    

    而是

    ProjectData projectData = new ProjectData();
    

    如果您从@ManagedBean 中省略了(name="ProjectData"),那么它将自动默认为projectData


    根据您的更新:

    错误com.sun.faces.mgbean.ManagedBeanCreationException 表示无法创建控制器bean,因为找不到projectData(模型bean)。

    property projectData 找不到其实更能说明问题。该属性不可写。换句话说,setter 不见了。以后请不要改写错误消息,只需复制粘贴即可。

    【讨论】:

    • 那是什么意思?我以小写字母开头所有实例。你想让我以大写开头吗?抱歉,我不清楚...斯文
    • 实例名称以小写开头,或省略(name="XXX")。这不是你的问题的原因,这只是一种做法。
    • 好的,BalusC 大师,我想知道我是否可以像私人教练一样为您预订 ;-)
    【解决方案2】:

    好吧,伙计们,我找到了答案:

    我的控制器中缺少 get 和 set 方法:

    /*
     * Getter and Setter
     */
    public ProjectData getProjectData() {
        return projectData;
    }
    
    public void setProjectData(ProjectData projectData) {
        this.projectData = projectData;
    }
    

    Reference

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2011-12-14
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      相关资源
      最近更新 更多