Чтобы это работало правильно, вы должны быть уверены, что используете 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. Я подтвердил, что это работает.