认为你把事情复杂化了。简而言之,当您拥有请求的 ID 时。对于提供对象,这就是它所需要的。
所以这里是:
<!-- this is in your gsp form that will be sending to request controller -maybe possibly it shold OfferController -->
<g:hiddenField name="userRequest.id" value="${instance.id}"/>
在那个控制器中
def MyController {
def actionOffer(OfferBean bean) {
bean.formatBean()
if (!bean.hasErrors()) {
//do SOmething
render view:'myView', model:[instance:bean]
return
}
render view:'failedView', model:[instance:bean]
}
}
在 src/main/groovy/package/OfferBean.groovy
class OfferBean implements Validateable {
// this is your actual request class
UserRequestBean userRequestBean
UserRequest userRequest
static constraints = {
request(nullable:false) //, validator:checkRequest)
}
def formatBean() {
UserRequestBean userRequestBean = new UserRequestBean()
userRequestBean.formatBean(request)
}
//You actually do not need this at all.
static def checkRequest = { val, obj, errors ->
if (!Request.get(obj.request.id)) {
errors.rejectValue('message','invalid.requestId',[val] as Object[],'')
}
}
}
基本上,您需要的只是将 userRequest.id 作为隐藏参数传递给 OfferBean 的验证类,其中约束设置为 false 这意味着如果 userRequest.id 没有神奇地与 UserRequest 域类绑定,它将失效并超出执行范围有一个返回的块告诉它一切都很好并且在那个块内处理
最重要的是,一旦绑定发生,即没有问题,您可以神奇地自动自动访问 actionOffer gsp 中 bean 中的所有请求元素
将上述内容与您所写的内容进行比较时,您明白我所说的复杂化是什么意思吗?
更新了控制器以显示如何将 bean 传递回视图。在 acionOffer myView gsp 中,如果您现在引用${instance.userRequestBean.something}
this 将映射并从请求中返回某物对象。(无需建立任何东西)一旦你有 id
因此,在阅读了您的评论之后,您需要的是另一个请求的 bean,当请求对象保存在 bean 中时,如下所示,您已经拥有了 bean。无论如何假设你
在 src/main/groovy/package/UserRequestBean.groovy
class UserRequestBean implements Validateable {
def id
String name
//mapped like your UserRequestBean domain class
//meaning it contains all elements
//Now a function to map in actual user request
//into this bean
protected def formatBean(UserRequest ur) {
this.id=ur.id
this.name=ur.name
//and so on
return this
}
}
查看更新后的代码,我添加了一个新的 formatBean 函数,它在主类中调用,然后绑定一个新的 userRequestBean,它现在包含您的实际 userRequest 域类的所有元素 - 您现在可以作为 userRequestBean 访问新表单上的那些元素。
我仍然认为您不需要所有这些复杂性。
你说用户然后想要更新请求,所以你最初得到 ${instance.userRequest} 整个对象你只需使用现有值重复表单,保存后你必须再次捕获它们以便重新应用现有值将原始对象保存到这些参数的代码,
无论如何,我已经向您展示了一种更复杂的方法,当您满意时,可以将真实域类绑定到瞬态对象(非数据库)
then save those values back over the main class you could introduce
def loadValues() {
Map values=[:]
//mapping all domain class objects back form bean
//required ones
values.with {
id=this.id
name=this.name
}
return values
}
那么你的object.properties=bean.loadValues()