#grails #grails-2.0 #grails-controller
#grails #grails-2.0 #grails-контроллер
Вопрос:
Должен ли я использовать фильтры или перехватчики для удовлетворения требований, нет ли более простого способа?
Обновить:
Похоже, что мой старый код работал просто отлично, я непреднамеренно отредактировал resources.groovy и сделал недействительным определение компонента
resources.groovy
================
beans = {
dateConverter DateConverter
}
BootStrap.groovy
================
class BootStrap {
def grailsApplication
def init = { servletContext ->
def ctx = grailsApplication.mainContext
def dataBinder = ctx.getBean(org.grails.databinding.SimpleDataBinder)
dataBinder.conversionHelpers[Date] = [ctx.getBean('dateConverter')]
}
}
Ответ №1:
Если вы хотите изменить его глобально, вы можете сделать что-то вроде этого:
class Foo {
String name
}
и в Bootstrap.groovy
(или в любом другом месте, которое вы предпочитаете):
JSON.registerObjectMarshaller(Foo) {
[name:it.name()]
}
Если вам это нужно только в особых случаях, проще всего (по моему опыту) создать карту и преобразовать ее в JSON
[name:'foo'] as JSON
Обновить
@BindUsing
работает и для объектов command..
class FooController {
def foo (FooCmd bind) {
render (text: "${bind.foo}")
}
}
class FooCmd {
@BindUsing({ obj, src ->
"@BindUsing ${src['foo']}"
})
String foo
}
curl -i -H "Content-Type: application/json" -d '{"foo":"FOO!!!!"}' http://localhost:8080/Stackoverflow/Foo/foo
Комментарии:
1. Спасибо! Но то, что я ищу, — это способ отменить / отменить / десериализовать ввод json, а не наоборот.
2. Ибп, извини, очевидно, я все неправильно понял. 😉 Знаете ли вы об
@BindUsing
этом?3. Да, и использовал его безрезультатно, это для привязок форм html.
4. Вы можете сделать это: class FooController { def foo (FooCmd bind) { render (текст: «${bind.foo}») } } class FooCmd { @BindUsing({ obj, src -> «@BindUsing $ {src[‘foo’]}» }) Строка foo } curl -i -H «Content-Type: application/json» -d ‘{«foo»:»FOO !!!!»}’ localhost:8080/Stackoverflow/Foo/foo
5. Ах, перепутал предыдущий комментарий и больше не могу его редактировать. Я добавил пример десериализации с
@BindUsing
размещением на объекте command. Он действительно связывает json из тела сообщения.