我正在结账,当用户去购买时,会创建一个Purchase
对象并保存到数据库中。然后我拿走对象的id
并将其发送到PayPal以生成一个按钮(这样我可以在以后识别购买)。但是,当我尝试检索id时,它返回null。
我在访问id之前尝试刷新它,但它似乎仍然无效。
这是我的域名对象:
package website
import java.time.Instant
import java.time.temporal.ChronoUnit
class Purchase {
String buttonId
final Instant expires
private boolean complete
User user
Product product
Purchase(Product product, User user) {
this.product = product
this.user = user
expires = Instant.now().plus(1, ChronoUnit.DAYS)
}
void completePurchase() {
// confirm that the purchase hasn't been completed already
if (complete) {
throw new PurchaseAlreadyCompleteException()
}
complete = true
}
boolean isComplete() {
return complete
}
static class ButtonIdAlreadyInitializedException extends RuntimeException {}
static class PurchaseAlreadyCompleteException extends RuntimeException {}
}
以下是我正在运行的代码:
Purchase purchase = new Purchase(product, user)
purchase.save(flush: true)
println 'purchase id: ' + purchase.id
答案 0 :(得分:4)
ID为null,因为您的对象未被保存。它未被保存的原因是您没有为WebAPI
分配值,并且此属性是必需的。您可以通过以下方式验证:
buttonId
答案 1 :(得分:1)
您需要捕获purchase.save()方法的结果。它返回更新的域对象,其中包含已解析的id。因此,您的代码应如下所示:
Purchase purchase = new Purchase(product, user)
purchase = purchase.save(flush: true)
if (!purchase || purchase.hasErrors()) {
log.error("Failed to commit purchase - probable validation errors')
}
println 'purchase id: ' + purchase.id
请注意,如果在save方法中设置failOnError:true标志,那么如果存在阻止保存方法的验证或hibernate / SQL错误,则会抛出异常。我觉得我比上面提供的软检查更喜欢异常处理。
此外,由于您的域定义中没有约束块,因此所有字段都可以为空:默认为false,因此您必须为buttonId提供值,否则域将无法验证并且purchase.save()方法调用会失败。