除了使用已弃用的BindDynamicMethod
,是否有一种方法可以在服务中利用bindData
?我不能只是使用
TestObject testObject = new TestObject()
TestObject testObject.properties = params
或者
TestObject testObject = new TestObject(params)
因为我有一个定制的绑定方法,利用我的
TestObject
类中的@BindUsing
注释。除了使用已弃用的BindDynamicMethod
,是否有一种方法可以在服务中利用bindData
?我不能只是使用
TestObject testObject = new TestObject()
TestObject testObject.properties = params
或者
TestObject testObject = new TestObject(params)
TestObject
类中的@BindUsing
注释。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)
// 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
}
}
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;
}
BindDynamicMethod
。 - dvisco