демаршаллинг в grails xml

Начиная с Grails 1.1.x, они поддерживают демаршаллинг XML и JSON для запросов REST. Кажется, я не могу заставить это работать в версии 2.1.0. Вот соответствующие файлы из примера проекта, который я использую для проверки функциональности:

  1. UrlMappings.groovy

    static mappings = {
        "/$action/$id?"(controller:'verification',parseRequest:true)
    
        "/"(view:"/index")
        "500"(view:'/error')
    }
    
  2. Tester.groovy

    class Tester {
        String name
        String vendor
    
        String toString() {
            return "$name $vendor"
        }
    }
    
  3. VerificationController.groovy

    class VerificationController {
    
        def save() {
            Tester tester = new Tester(params.tester)
            log.error "Tester = ${tester}"
            log.error "Request XML = ${request.XML}"
        }
    }
    
  4. Отправка XML с вызовом REST

    <?xml version="1.0" encoding="utf-8"?>
    <tester>
        <name>Windows</name>
        <vendor>Microsoft</vendor>
    </tester>
    

Когда я передаю XML, операторы журнала контроллера выводят следующее:

Tester = null null
Request XML = WindowsMicrosoft

Мое недоумение было бы в том, почему он распознает его как XML (поместив его в поле XML запроса), но не проанализирует его и не поместит в параметры, как определено здесь


person Peter LaBanca    schedule 22.08.2012    source источник


Ответы (2)


Попробовав несколько часов с той же проблемой, я нашел решение для себя.

Моя проблема заключалась в том, что в моем вызове REST не был определен тип содержимого.

Поэтому, если вы добавите content-type: application/xml к своему вызову rest, он должен работать.

person Senic    schedule 16.07.2013

У меня была такая же проблема, почти с такой же настройкой. Я считаю, что ваша проблема может заключаться в конфигурации UrlMapping. Изначально у меня было следующее.

"/rest/airport/$iata?"(controller: "airport", action: "restHandler", parseRequest: "true")

Когда я PUT/POST XML для этого URI, он будет правильно отображаться в request.XML, но никогда не будет отображаться в объекте params. Затем я понял, что у меня есть логическое значение parseRequest в кавычках. Удаление, которое устранило проблему.

"/rest/airport/$iata?"(controller: "airport", action: "restHandler", parseRequest: true)

Теперь, если ваш код действительно такой же, как у вас выше, ваша проблема может быть не совсем такой же. Тем не менее, что может помочь, так это внести какие-то изменения в ваши UrlMappings, чтобы посмотреть, сможете ли вы заставить его работать по-другому.

Сначала я подумал, что это могли быть одинарные кавычки, которые у вас были, но, похоже, это работало нормально в любом случае, как я пробовал. Итак, я бы предложил просто изменить сопоставление URI на что-то другое и быть очень разборчивым в форматировании. В конце концов, это была всего лишь небольшая проблема с форматированием в файле UrlMappings.groovy, которая решила мою проблему.

person cdbyrd    schedule 20.09.2012