Используя @RequestBody и @ModelAttribute вместе? - PullRequest
5 голосов
/ 25 февраля 2011

Я пытаюсь получить тело POST, и мне бы хотелось, чтобы параметры моего метода привязывались к объекту.

Возможно ли это?

Моя текущая декларация никогда не попадет:

 @RequestMapping(method = RequestMethod.POST)
public void doStuff(@RequestBody byte[] bodyData, @ModelAttribute Form form, Model model ) {

Похоже, я получаю это исключение:

- 2011-02-25 16:57:30,354 - ERROR - http-8080-3 - org.springframework.web.portle
t.DispatcherPortlet - Could not complete request
java.lang.UnsupportedOperationException: @RequestBody not supported

Ответы [ 2 ]

6 голосов
/ 28 февраля 2011

Чтобы это работало правильно, вы должны быть уверены, что используете AnnotationMethodHandlerAdapter . Это переопределяет HandlerMethodInvoker's createHttpInputMessage (который выдает исключение, которое вы видите). (Это делается в частном классе.)

Я полагаю, что вы можете просто включить следующее в * -servlet.xml

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

ВНИМАНИЕ: приведенный ниже ответ предназначен для случая, когда @RequestBody и @RequestParam нужны в одном и том же методе-обработчике. Он не отвечает на этот вопрос, но может быть кому-то полезен.

Я проверил это с помощью Spring 3.0.1. Это возможно, но это несколько опасно. Вы ДОЛЖНЫ иметь аргумент метода @RequestBody перед аргументом @RequestParam. Я предполагаю, что это потому, что HandlerMethodInvoker читает тело запроса (вместе с параметрами GET) при получении параметров (и тело запроса может быть прочитано только один раз).

Вот пример (ВНИМАНИЕ: я кодирую в Scala, поэтому я не компилировал этот код Java)

@RequestMapping(value = "/test", method = RequestMethod.POST)
public String test(
        @RequestBody String body,
        @RequestParam("param1") String parma1,
        Map<Object, Object> model: Map[AnyRef, AnyRef])
{
    model.put("test", test)
    model.put("body", body)

    return "Layout"
}

Альтернативой является использование @PathVariable. Я подтвердил, что это работает.

1 голос
/ 05 февраля 2013

К сожалению, это отчасти невозможно. Если вы используете портлетную версию Spring MVC (и она выглядит как из журналов), то вас может заинтересовать эта проблема JIRA .

AnnotationMethodHandlerAdapter внутренне использует PortletHandlerMethodInvoker, а второй является внутренним подклассом HandlerMethodInvoker - места, где вы можете настроить HttpMessageConverter-s. Но они установлены в ноль. И имущество является окончательным.

Это даже было бы обходным решением, если бы вы могли заменить HandlerMethodInvoker, но не можете .. он создан конструктором;)

Следует отметить, что версия Spring MVC с сервлетами полностью поддерживает HttpMessageConverter-s и не страдает этой проблемой.

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