2015-08-31 3 views
4

Есть ли способ использовать bindData в службе, кроме использования устаревшего BindDynamicMethod? Я не могу просто использоватьGrails binddata на службе

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

или

TestObject testObject = new TestObject(params) 

, потому что у меня есть метод пользовательских привязок, использующий @BindUsing аннотации в моем TestObject классе.

+0

Да, но варианты различны для разные версии Grails. Какую версию Grails вас интересует? –

+0

@JeffScottBrown Я использую grails 2.4.4 – dvisco

+0

I [не вижу ни одного из тех методов, отмеченных как устаревшие в Grails 2.4.4] (http://grails.github.io/grails-doc/2.4.4/api /org/codehaus/groovy/grails/web/binding/DataBindingUtils.html). – dmahapatro

ответ

4

В 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 
    } 
} 
+0

Это именно то, что я в итоге начал! Благодаря! – dvisco

11

Если вы используете 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) 
0

В 2.5, я обнаружил, что эмулировать поведение 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; 
}