【问题标题】:Grails Hibernate Session or Spring Transaction destroying Domain validation errorsGrails Hibernate Session 或 Spring Transaction 破坏域验证错误
【发布时间】:2013-05-22 17:36:09
【问题描述】:

所以我的问题是,在我可以在页面上呈现它们之前,我的验证错误已从我的域对象中删除。我以为我过去已经修复了这个错误,但它又悄悄出现在我身上。

这是我最初的实现。调用tripService.stepData(trip) 时正在清除错误。

编辑 - 我不应该只在页面添加到 hasMany 关系时遇到此问题。

控制器 -

    Trip trip = tripService.savePrePaymentInfo(params)

    if (trip.hasErrors()) {
        render(view: "step4", model: tripService.stepData(trip))
    }
    else {
        redirect(action: trip.status.action, id:trip.id)
    }

服务 -

Map stepData(Trip trip)
{
    Map returnSet = [:]
    returnSet.status = Status.findAllByActionNotEqual("review")
    returnSet.trip = trip
    returnSet
}

所以我在网上做了一些阅读,有人在 2 年前的论坛帖子上说休眠中有一些东西......可能的错误......我不知道,但他们的建议奏效了。建议是将控制器包装在 withTransaction:

Trip.withTransaction {

//Controller code here

}

这对我来说一直很好。现在的问题是我认为我有一个标记库,它再次调用tripService。进行该调用时,它现在正在清除我的验证错误。这真是令人沮丧。有没有人知道我可以做些什么来解决这个问题?

编辑:添加从 taglib 调用的服务方法:

String findBannerName(Long pidm, String format = 'LFMI')
{
    "abc"
    //It really doesnt matter what is here - tried just returning this string and it produced the issue        
}

【问题讨论】:

  • 可能是因为您的服务是事务性的,即使stepData() 不是?如果将 setpData 声明为非事务性会发生什么?
  • 你能声明服务方法是非事务性的,而不让整个服务都这样吗?
  • 我认为唯一可行的方法是将服务设置为事务性 false 并注释必须是事务性的方法。
  • 好的,我试一试 - 很快就会报告
  • 好的,我只将更新数据库的方法标记为事务性的,它似乎正在工作。将您的评论放在答案中,我会将其标记为已接受,但是,我真的很想知道为什么会这样。

标签: spring hibernate validation grails grails-services


【解决方案1】:

您确定首先填充了 trip.errors 属性吗?

另外,你在 taglib 中调用了哪个 tripService 方法?

【讨论】:

  • 是的,我确定。为您添加了问题的方法。
  • 查看grails.org/doc/2.1.0/guide/services.html 中的措辞和示例代码 sn-ps,验证错误和回滚:“要重新呈现事务已回滚的相同视图,您可以重新关联渲染前刷新实例的错误”。
  • 我看到了那个例子,它对没有 ID 的新对象如何工作?另外...只是一个意见...如果必须这样做真的很愚蠢。
  • 在示例中,您会从验证异常中获得错误。您还说过,这种行为仅在添加到 hasMany 关系时才会发生。验证错误是否有可能存在于引用的域对象(hasMany 集合成员)中?
  • 不,没有机会。在验证异常之后,它会执行 .read(id)。对于新对象,没有 ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多