我有多年开发JSF应用程序的经验,但这是一个令人困惑的错误,这让我感到疯狂。我想我需要一双新眼睛才能找到可能的错误。
首先,有关环境的详细信息:
现在关于问题/错误本身。在JSF-Lifecycle的第4阶段,Update模型值阶段,我的CDI-Bean内的成员对象以某种方式返回null。更新模型中的值时,将引发PropertyNotFoundException。令人困惑的部分是,我对我的所有项目使用了几乎相同的样板代码,这是我第一次遇到这个问题。为了使它更加混乱,我有三个实体,只有其中一个正确更新。
XHTML-Snippet:
<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)" />
Controller-Snippet:
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;
}
如前所述,在JSF生命周期的第4阶段,项目实体以某种方式失去了它的价值。我得到了相当臭名昭着的例外
Caused by: javax.el.PropertyNotFoundException: /administration/project.xhtml @54,26 value="#{projectController.project.name}": Target Unreachable, 'null' returned null
为了进行测试,我将打印件放在PostConstruct内,并在控制器内放置项目的相应吸气剂。这是在我触发保存按钮后加载页面的输出:
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-code,没有真正的魔法,我已经完成了一千次,现在发生这种情况。我仔细检查了各处的导入,清理了所有临时数据,在各种服务器版本上测试了它,测试了所有CDI-Scopes,比较了xhtml和controller文件与差异等等。我已经完成了通常修复bug的所有步骤那样或者给我一个解决方案的暗示。没有。令人难以置信的是,它适用于一个实体,而其他实体则抛出错误。当xhtml和控制器的连接对所有实体基本相同时,这种不一致的行为使我更难找到错误。
我对这个知识的最后知识。也许我的眼睛在这么多个小时后都找不到原因,但对我来说似乎完全没问题。你们有没有遇到过这个?
如果您需要更多信息,我很乐意为您提供。 我感谢你的任何提示并感谢你的帮助。
答案 0 :(得分:1)
有了BalusC的暗示,我追踪了错误。
以某种方式,页面上的PrimeFaces Datatable方式在同一请求中触发了它的选择,覆盖了实体。我不知道为什么没有实际选择就会这样做,但是通过添加输入字段的显式处理,错误消失了。 没有问题的实体,在其XHTML中没有DataTable,这可以用相同的控制器代码解释行为不一致的原因。
这让我感到非常愚蠢,但是最后暗示我会在第一时间内完成安装工,我找到了错误。
谢谢BalusC,谢谢Stackoverflow!