Grails在服务中绑定数据

5

除了使用已弃用的BindDynamicMethod,是否有一种方法可以在服务中利用bindData?我不能只是使用

TestObject testObject = new TestObject()
TestObject testObject.properties = params

或者

TestObject testObject = new TestObject(params)

因为我有一个定制的绑定方法,利用我的TestObject类中的@BindUsing注释。

是的,但不同版本的Grails选项是不同的。您对哪个版本的Grails感兴趣? - Jeff Scott Brown
@JeffScottBrown 我正在使用 Grails 2.4.4。 - dvisco
我在Grails 2.4.4中没有看到任何被标记为弃用的方法。 (http://grails.github.io/grails-doc/2.4.4/api/org/codehaus/groovy/grails/web/binding/DataBindingUtils.html) - dmahapatro
@dmahapatro 抱歉,我不得不将其更改为 BindDynamicMethod - dvisco
3个回答

20
如果您正在使用Grails 3.*,则服务类可以实现DataBinder特质并按照以下示例实现bindData():
import grails.web.databinding.DataBinder

class SampleService implements DataBinder {

    def serviceMethod(params) {
        Test test = new Test()
        bindData(test, params)

        test
    }

    class Test {
        String name
        Integer age
    }
}

这是我在Grails控制台中快速尝试的方法:

grailsApplication.mainContext.getBean('sampleService').serviceMethod(name: 'abc', age: 10)

5
在Grails 2.4.4中,您可以像这样操作:
// grails-app/services/demo/HelperService.groovy
package demo

import org.grails.databinding.SimpleMapDataBindingSource

class HelperService {

    def grailsWebDataBinder

    TestObject getNewTestObject(Map args) {
        def obj = new TestObject()
        grailsWebDataBinder.bind obj, args as SimpleMapDataBindingSource
        obj
    }
}

这正是我最终选择的!谢谢! - dvisco

0
在2.5中,我发现通过在辅助服务中模拟Controller API的行为可以实现此功能:
def bindData(def domainClass, def bindingSource, String filter) {
    return bindData(domainClass, bindingSource, Collections.EMPTY_MAP, filter)
}
def bindData(def domainClass, def bindingSource, Map includeExclude, String filter) {
    DataBindingUtils
        .bindObjectToInstance(
            domainClass, 
            bindingSource,
            convertToListIfString(includeExclude.get('include')),
            convertToListIfString(includeExclude.get('exclude')), 
            filter);
    return domainClass;
}

convertToListIfString是根据控制器方法而来的:

@SuppressWarnings("unchecked")
private List convertToListIfString(Object o) {
    if (o instanceof CharSequence) {
        List list = new ArrayList();
        list.add(o instanceof String ? o : o.toString());
        o = list;
    }
    return (List) o;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接