Jsf 2 CDIBean成员在请求期间丢失值

Jsf 2 CDIBean成员在请求期间丢失值,jsf-2,primefaces,cdi,Jsf 2,Primefaces,Cdi,我有多年开发JSF应用程序的经验,但这是一个令人困惑的错误,让我发疯。我想我需要一双新的眼睛来发现可能的错误 首先,有关环境的详细信息: JDK:8u40 服务器:WildFly 8.2.0.Final Libs:cdi1.2、jsf2.2、omnifaces2.0、primefaces5.2、Hibernate、jpa2.1 IDE:eclipsejuno 现在谈谈问题/Bug本身。在JSF生命周期的第4阶段,即更新模型值阶段,CDIBean中的成员对象以某种方式返回null。更新模型中的

我有多年开发JSF应用程序的经验,但这是一个令人困惑的错误,让我发疯。我想我需要一双新的眼睛来发现可能的错误

首先,有关环境的详细信息:

  • JDK:8u40
  • 服务器:WildFly 8.2.0.Final
  • Libs:cdi1.2、jsf2.2、omnifaces2.0、primefaces5.2、Hibernate、jpa2.1
  • IDE:eclipsejuno
现在谈谈问题/Bug本身。在JSF生命周期的第4阶段,即更新模型值阶段,CDIBean中的成员对象以某种方式返回null。更新模型中的值时,将引发PropertyNotFoundException。令人困惑的是,我在所有项目中使用了几乎相同的样板代码,这是我第一次遇到这个问题。更令人困惑的是,我有三个实体,其中只有一个被正确更新

XHTML代码段:

<p:inputText id="name" value="#{projectController.project.name}"
    required="true">
    <f:validateLength minimum="2" />
</p:inputText>
<p:commandButton icon="fa-save" action="#{projectController.save}"
    value="Save" update="@(.ui-datatable) @(.ui-inputfield)" />
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import com.deadknight.web.resumee.model.entity.dao.ProjectDao;
import com.deadknight.web.resumee.model.entity.impl.Project;
import com.deadknight.web.resumee.utils.PrimefacesUtils;

@Named
@ViewScoped
public class ProjectController extends BaseController {

    private static final long serialVersionUID = 2352991211048821234L;

    @Inject
    ProjectDao dao;

    private List<Project> allProjects;
    private Project project, selectedProject;

    @PostConstruct
    public void init() {
        allProjects = dao.listAll();
        System.out.println("Constructing project inside Post-Construct now");
        project = new Project();
    }

    public void save() {
        if (project.isTransient()) {
            dao.create(project);
        } else {
            dao.update(project);
        }
        allProjects.add(project);
        project = new Project();
    }

    public Project getProject() {
        if (project == null)
            System.out.println("Bloody thing is null!");
        else
            System.out.println("Not null yet");
        return project;
    }

    public void setProject(Project project) {
        this.project = project;
    }
为了进行测试,我将打印放在PostConstruct中,并将项目的相应getter放在控制器中。这是触发保存按钮后将页面加载到的输出:

15:51:08,394 INFO  [stdout] (default task-17) Constructing project inside Post-Construct now
15:51:08,394 INFO  [stdout] (default task-17) Not null yet
...
//Button is submitting the POST now
15:51:18,421 INFO  [stdout] (default task-20) Not null yet
15:51:18,423 INFO  [stdout] (default task-20) Not null yet
15:51:18,423 INFO  [stdout] (default task-20) Not null yet
15:51:18,424 INFO  [stdout] (default task-20) Not null yet
...
15:51:18,426 INFO  [stdout] (default task-20) Bloody thing is null!
15:51:18,426 INFO  [stdout] (default task-20) Bloody thing is null!
15:51:18,427 INFO  [stdout] (default task-20) Bloody thing is null!
15:51:18,427 INFO  [stdout] (default task-20) Bloody thing is null!
这是简单的crud代码,没有真正的魔法,我已经做了一千次了,现在这种情况发生了。我仔细检查了所有的导入,清理了所有的临时数据,在不同的服务器版本上测试了它,测试了所有的CDI作用域,比较了xhtml和控制器文件与差异,等等。我已经完成了通常修复类似错误的所有步骤,或者为解决方案提供了提示。没有什么。它让我难以置信,它只适用于一个实体,而其他实体则会抛出错误。这种不一致的行为使我更难找到bug,因为xhtml和控制器的连接对于所有实体来说基本相同

关于这一点,我已知之甚少。也许我的眼睛在这么多小时后都找不到原因,但对我来说似乎很好。你们中有人以前遇到过吗

如果你需要更多的信息,我很乐意提供。
我很感激任何暗示,谢谢你的帮助

在巴卢斯克的提示下,我找到了错误

不知何故,页面上方的PrimeFaces数据表在同一请求中触发了null选择,覆盖了实体。我不知道为什么在没有实际选择的情况下会这样做,但是通过添加对输入字段的显式处理,错误消失了。 没有问题的实体在其XHTML中没有数据表,这可以解释为什么行为与相同的控制器代码不一致

这让我觉得自己真的很愚蠢,但随着最后一点反思二传手的暗示,我发现了错误,我本来应该这么做的


谢谢你,巴卢斯克,谢谢你

我看到您有一个setter(这在这个构造中实际上是不必要的,JSF永远不会调用嵌套bean/实体上的setter)。在上面放置一个调试断点,并检查它是否以
null
作为值调用,如果是,则在调用堆栈中查找负责的。
15:51:08,394 INFO  [stdout] (default task-17) Constructing project inside Post-Construct now
15:51:08,394 INFO  [stdout] (default task-17) Not null yet
...
//Button is submitting the POST now
15:51:18,421 INFO  [stdout] (default task-20) Not null yet
15:51:18,423 INFO  [stdout] (default task-20) Not null yet
15:51:18,423 INFO  [stdout] (default task-20) Not null yet
15:51:18,424 INFO  [stdout] (default task-20) Not null yet
...
15:51:18,426 INFO  [stdout] (default task-20) Bloody thing is null!
15:51:18,426 INFO  [stdout] (default task-20) Bloody thing is null!
15:51:18,427 INFO  [stdout] (default task-20) Bloody thing is null!
15:51:18,427 INFO  [stdout] (default task-20) Bloody thing is null!