Как Grails 2.5.6 анализирует и отображает запрос JSON в POGO? - PullRequest
0 голосов
/ 25 октября 2018

Tl; др : я хочу пройти тест MyCmdTest."data bind works" в этот код зеленый.
Спасибо Джеффу Скотту Брауну за получение меня так далеко .


У меня есть POGO с некоторыми пользовательскими преобразованиями из JSON, которые я ожидаю получить в контроллере Grails:

def myAction(MyCmd myData) {
    ...
}

С:

@Validateable
class MyCmd {
    SomeType some

    void setSome(Object value) {
        this.some = customMap(value)
    }
}

Обратите внимание, как customMap создает экземпляр SomeType из значения JSON (скажем, String).Давайте предположим, что установщик по умолчанию не будет работать;например, шаблон, который у нас есть более одного раза, является перечислением следующим образом:

enum SomeType {
    Foo(17, "foos"),
    Bar(19, "barista")

    int id
    String jsonName

    SomeType(id, jsonName) {
        this.id = id
        this.jsonName = jsonName
    }
}

Здесь customMap будет принимать целое число или строку и возвращать соответствующий регистр (или null, еслине подходит).

Теперь у меня есть модульный тест следующей формы:

class RegistrationCmdTest extends Specification {
    String validData // hard-coded, conforms to JSON schema

    void test() {
        MyCmd cmd = new MyCmd(JSON.parse(validData))
        // check members: success

        MyCmd cmd2 = JSON.parse(validData) as MyCmd
        // check members: success
    }
}

Видимо, setSome вызывается в обоих вариантах.

Я такжеиметь тестовый модуль контроллера, который устанавливает для JSON запроса ту же строку:

void "register successfully"() {
    given:
    ResonseCmd = someMock()

    when:
    controller.request.method = 'POST'
    controller.request.contentType = "application/json"
    controller.request.json = validData
    controller.myAction()

    then:
    noExceptionThrown()
    // successful validations: service called, etc.
}

По сути, то же самое выполняется и в качестве интеграционного теста.

Однако отображение не удается при запуске полного приложения;some == null.

Какие методы мне нужно реализовать или переопределить, чтобы Grails вызывал мои преобразования (здесь customMap) вместо вставки null, где он не знает, что делать?

1 Ответ

0 голосов
/ 06 ноября 2018

Можно настроить привязку данных с помощью аннотации @BindUsing:

@BindUsing({ newCmd, jsonMap ->
    customMap(jsonMap['someType'])
})
SomeType someType

См. Также Репозиторий MWE .

Источники: Хьюберт КляйнIkkink @ DZone , Официальные документы (есть другие способы настройки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...