JSF嵌套对象在提交时设置为null

时间:2017-11-20 00:42:13

标签: jsf primefaces nested submit jsf-2.2

我正面临此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;
}

}

1 个答案:

答案 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或其他一些对象的初始化过程中肯定会遗漏一些东西。运行我的示例控制器与您的页面,并检查它是否正常工作,并将您的调试范围缩小到未在问题中发布的控制器部分。