我正面临此SO线程Why does JSF null out a nested class successfully instantiated in the backing bean?中描述的类似问题 我有一个简单的表单(JSF-2.2)来创建一个具有多个嵌套对象及其各自属性的对象。实例化成功发生,我可以看到所有对象及其子节点都不为null但由于某种原因,当我提交表单时,整个对象树再次设置为null。在下面的示例中,值模板将导致
javax.el.PropertyNotFoundException:目标无法访问,'null' 返回null。
因为某些原因,ArticleListConfiguration被设置为null,因为提交发生了。
<ui:composition template="../template/template.xhtml">
<ui:define name="content">
<h:form id="createArticleListForm">
<p:panel styleClass="content-panel">
<h:panelGrid
columns="2"
styleClass="borderless-grid"
columnClasses="create-article-list-panel, create-article-list-panel">
<p:panel
id="listValuesPanel">
<p:inputText
id="articleListName"
value="#{createArticleListController.articleList.name}"/>
<p:inputText
id="articleListSize"
maxlength="3"
value="#{createArticleListController.articleListSize}">
</p:inputText>
<p:selectBooleanCheckbox
id="saveArticleListConfigurationAsTemplate"
value="#{createArticleListController.articleList.articleListConfiguration.template}"/>
<h:panelGrid
columns="1">
<p:fileUpload
id="upload"
widgetVar="fileUploadWidget"
fileUploadListener="#{createArticleListController.uploadImages}"
multiple="true"
onstart="submitSelection()"
oncomplete="handleMultiFileUploadRequest(PF('fileUploadWidget'));"
allowTypes="/(\.|\/)(jpg|png)$/"
styleClass="ui-widget"/>
<p:remoteCommand
name="submitSelection"
process="@this"/>
</h:panelGrid>
</p:panel>
</h:panelGrid>
<br/>
<p:commandButton
id="createArticleListButton"
process="@this @form"
value="#{contentController.getContent('createArticleList')}"
actionListener="#{createArticleListController.onCreate()}"/>
</p:panel>
</h:form>
</ui:define>
这是支持豆
@ManagedBean
@ViewScoped
public class CreateArticleListController extends AbstractController {
@Inject
private ArticleListService articleListService;
private ArticleList articleList;
private Integer articleListSize;
private List<Pair<String, InputStream>> files;
@PostConstruct
public void init() {
//The constructor of ArticleList creates and attaches instances of all necessary nested objects
articleList = new ArticleList();
files = new ArrayList<>();
}
public void onCreate() throws IOException {
articleListService.create(articleList, files);
navigateTo("articleListOverview");
}
public void uploadImages(FileUploadEvent event) {
try {
files.add(Pair.of(event.getFile().getFileName(), event.getFile().getInputstream()));
} catch (IOException e) {
LOGGER.log(Level.ERROR, "Error uploading files");
JsfMessageUtils.sendErrorMessageToUser("Error uploading files");
}
}
public ArticleList getArticleList() {
return articleList;
}
public void setArticleList(ArticleList articleList) {
this.articleList = articleList;
}
public Integer getArticleListSize() {
return articleListSize;
}
}
答案 0 :(得分:1)
缺少Setter
private Integer articleListSize;
和p:inputText
无法找到它。
添加
public void setArticleListSize(Integer articleListSize) {
this.articleListSize = articleListSize;
}
到CreateArticleListController
。
还要确保ArticleList
类及其子类已定义所有引用的getter和setter。
更新:
我已经使用原始xhtml页面创建了正常工作的控制器
//...
import javax.faces.bean.ViewScoped;
//...
@ManagedBean(name = "createArticleListController")
@ViewScoped
public class CreateArticleListController implements Serializable {
ArticleList articleList;
private Integer articleListSize;
@PostConstruct
public void init() {
System.out.println("On init controller");
// initiliazing data
articleList = new ArticleList();
articleList.setName("List 1");
//if you omit following lines, you will get the same exception posted in your question
ArticleListConfiguration ac = new ArticleListConfiguration();
ac.setTemplate(false);
articleList.setArticleListConfiguration(ac);
}
public ArticleList getArticleList() {
return articleList;
}
public void setArticleList(ArticleList articleList) {
this.articleList = articleList;
}
public Integer getArticleListSize() {
return articleListSize;
}
public void setArticleListSize(Integer articleListSize) {
this.articleListSize = articleListSize;
}
public void onCreate() throws IOException {
System.out.printf("On create -> Article name: %s, size: %s, template: %s\r\n", articleList.getName(), articleListSize, articleList.getArticleListConfiguration().isTemplate());
}
public void uploadImages(FileUploadEvent event) {
System.out.println("On upload image " + event.getFile().getFileName());
}
}
因此,ArticleList
或其他一些对象的初始化过程中肯定会遗漏一些东西。运行我的示例控制器与您的页面,并检查它是否正常工作,并将您的调试范围缩小到未在问题中发布的控制器部分。