在JSF表单中可以为null的属性

时间:2018-03-26 21:39:30

标签: java jsf-2 cdi el propertynotfoundexception

在JSF表格中有:

<h:inputText value="#{personBean.person.personDetail.attribute}" />

实体Person是从PostConstruct带注释的方法的数据库加载的。但是,personDetail实例的属性Person可以为null。因此,当填写输入并提交表单时,会抛出异常(更具体地说是javax.el.PropertyNotFoundException: (...) Target Unreachable, ''personDetail'' returned null)。

我搜索并找到了一些很好的例子来解决这个异常,例如:

但是,我认为这个问题不同。找到person实例,其实例属性可以为null。

我还尝试在PersonDetail方法上为空时设置PostConstruct的新实例,但由于“对象(personDetail),问题变成了持久性问题引用未保存的瞬态实例“。

那么,如何处理这个问题?

来源

短支持bean:

@Named(value = "personBean")
@ViewScoped
public class PersonBean {

    (...)

    @PostConstruct
    public void init() {
        person = personService.findById(1L);

        // throw -> TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing
        // if (person.getPersonDetail() == null) {
        //    person.setPersonDetail(new PersonDetail());
        // }
        (...)
    }
}

短实体类:

@Entity
public class Person {

    (...)

    @OneToOne(mappedBy = "pessoa", fetch = FetchType.LAZY)
    private PersonDetail personDetail;

    // Getters and Setters
}

-

public class PersonDetail {

    private String attribute;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "person_id", unique = true, nullable = false)
    private Person person;

    // Getters and Setters

}

1 个答案:

答案 0 :(得分:0)

通过 personDetail 实现解决方案的第一部分 null ,第二部分是在插入数据库之前进行检查

  

如果personDetail.getAttributes!= null则插入其他插入   空