JSF / JPA值绑定表达式没有设置实体bean的属性

时间:2013-09-09 14:35:44

标签: java jsf cdi

我正在学习JSF / EJB,但我遇到了一个问题。

我正在尝试编写一个从用户获取字符串并将该字符串存储到数据库的代码。

这是我的代码: 实体bean:

@Entity

public class TestTable implements Serializable {


private static final long serialVersionUID = 1L;

public TestTable() {
    super();
}

@Id
@GeneratedValue
private int firstcolumn;
private String secondcolumn;

private String testphrase = "test phrase";


public String getTestphrase() {
    return testphrase;
}
public void setTestphrase(String testphrase) {
    this.testphrase = testphrase;
}
public int getFirstcolumn() {
    return firstcolumn;
}
public void setFirstcolumn(int firstcolumn) {
    this.firstcolumn = firstcolumn;
}
public String getSecondcolumn() {
    return secondcolumn;
}
public void setSecondcolumn(String secondcolumn) {
    this.secondcolumn = secondcolumn;
}



}
  • 表有三列,第一列是主键,第二列存储用户输入的字符串,第三列存储“测试短语”。

控制器bean:

@Named
public class TestController  implements Serializable {

private static final long serialVersionUID = 1L;

@EJB
DataAccess dacc;


@Inject
TestTable testTable;

public TestController()
{

}



public TestTable getTestTable() {
    return testTable;
}



public void setTestTable(TestTable testTable) {
    this.testTable = testTable;
}



public void test()
{

    System.out.println("string secondcolumn= "+ testTable.getSecondcolumn());
    dacc.addtodb(testTable);


}

}
  • 我使用了System.out.println(“string secondcolumn =”+ testTable.getSecondcolumn());在方法test()中,在将数据写入数据库之前检查数据。我的问题是,它始终为空。控制台输出: INFO:string secondcolumn = null。

第二列不是由JSF中的值绑定表达式设置的。

现在,JSF:

        <h:outputText value="Second column:">
        </h:outputText>


        <h:inputText label="Second column" value="#{testController.testTable.secondcolumn}">                
        </h:inputText>


        <h:outputText value="#{testController.testTable.getTestphrase()}">
        </h:outputText>

        <h:commandButton action="#{testController.test}" value="Save">
    </h:commandButton>

我检查了数据库并且正在添加行。列SECONDCOLUMN中的条目为NULL。

TESTPHRASE中的条目是“测试短语”。我没有得到任何错误消息,我已尽力解决问题,现在我被卡住了。欢迎任何反馈。

1 个答案:

答案 0 :(得分:2)

您的问题是您正在注入实体类。最好的方法是使用new关键字手动初始化它,从数据库中检索实体等。一种方法是在CDI bean中使用@PostConstruct方法:

@Named
//here you should define the scope of your bean
//probably @RequestScoped
//if you're working with JSF 2.2 there's already a @ViewScoped
public class TestController  implements Serializable {

    private static final long serialVersionUID = 1L;
    @EJB
    DataAccess dacc;
    //this musn't be injected since it's not a business class but an entity class
    //@Inject
    TestTable testTable;

    public TestController() {
    }

    @PostConstruct
    public void init() {
        //basic initialization
        testTable = new TestTable();
    }

    //rest of your code...
}

通过此更改,JSF将能够将<h:form>中的值设置为有界字段。请注意,JSF代码将根据EL中定义的相应调用必要的getter和setter,它不会创建有界字段的新实例。在将表单提交到服务器时生成视图和setter时会调用getter。

更多信息: