空实体字段使@PostUpdate方法静默停止

时间:2011-11-09 14:37:40

标签: jpa spring-mvc post-update

我有一个JPA域实体,我正在从用户输入更新。根据有关该对象的许多因素,它具有在更新时执行的操作(在这种情况下,更新是“将其标记为已完成”)。

在数据库中,两个“完成后操作配置”字段(note和next_workflow)可以为空,并且具有感兴趣的值,或者为NULL。可能会有很多这些,但我从这两个开始。

我在模型类中编写了以下方法:

@PostUpdate
public void gotUpdate() {
    System.out.println("Got post update for " + this.getDescription());
    if (! this.getNote().isEmpty()) {
        Note n = new Note();
        n.setAssetId(this.getAssetId());
        n.setNotifyLessor(1);
        n.setNote(this.getLessorNote() + this.getCapturedData());
        n.setCreatedDate(new Date());
        n.persist();
    }
    System.out.println("In the middle of post update for " + this.getDescription());
    if (this.getNextWorkflow() != 0) {
        Asset a = this.getAssetId();
        a.setWorkflowId(Workflow.findWorkflow(this.getNextWorkflow()));
        a.merge();          
    }
    System.out.println("Finishing post update for " + this.getDescription());
}

对于具有NULL“note”值的实体,控制台输出为:

Got post update for this item

对于具有非NULL“note”值且NULL为“nextWorkflow”值的实体,控制台输出为:

Got post update for this item
In the middle of post update for this item

任何地方都没有错误,没有堆栈转储,没有任何错误。该方法只是默默地退出,并且我在这个实体上做的合并没有完成(数据库保持不变)。

在调试器中逐步执行此操作会到达正在测试内容的行,如果值为NULL,则会弹出一个标签“Source not found”,我真的不知道该怎么做。我认为这只是调试人员说它不能介入某些东西,但我实际上并没有要求它......

1 个答案:

答案 0 :(得分:0)

新秀问题,结果证明了。

如果Object的{​​{1}}字段为空,则field是对空指针的调用。

答案是测试字段的空值,而不是零点的一些副作用。

object.getField().length()