Spring: Как получить параметры из тела POST?

Веб-сервис с использованием spring, в котором я должен получить параметры из тела моего почтового запроса? Содержание тела похоже на: -

source="mysource"

&json=
{
    "items": [
        {
            "username": "test1",
            "allowed": true
        },
        {
            "username": "test2",
            "allowed": false
        }
    ]
}

И метод веб-сервиса выглядит так: -

@RequestMapping(value = "/saveData", headers="Content-Type=application/json", method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<Boolean> saveData(@RequestBody String a) throws MyException {
        return new ResponseEntity<Boolean>(uiRequestProcessor.saveData(a),HttpStatus.OK);

    }

Пожалуйста, дайте мне знать, как мне получить параметры из тела? Я могу получить все тело в своей строке, но я не думаю, что это был бы правильный подход. Пожалуйста, дайте мне знать, как мне продолжить.

Ответ 1

Вы можете получить param из запроса.

@ResponseBody
public ResponseEntity<Boolean> saveData(HttpServletRequest request,
            HttpServletResponse response, Model model){
   String jsonString = request.getParameter("json");
}

Ответ 2

Вы можете получить все тело сообщения в POJO. Следующее что-то подобное

@RequestMapping(value = { "/api/pojo/edit" }, method = RequestMethod.POST, produces = "application/json", consumes = "application/json")
@ResponseBody
public Boolean editWinner( @RequestBody Pojo pojo) { 

Где каждое поле в Pojo (включая геттер/сеттеры) должно соответствовать объекту запроса Json, который получает контроллер.

Ответ 3

Вы можете связать json с POJO с помощью MappingJacksonHttpMessageConverter. Таким образом, ваша подпись контроллера может читать: -

  public ResponseEntity<Boolean> saveData(@RequestBody RequestDTO req) 

Где RequestDTO должен быть bean соответствующим образом аннотирован для работы с сериализацией/десериализацией джексона. Ваш файл * -servlet.xml должен иметь конвертер сообщений Jackson, зарегистрированный в RequestMappingHandler, следующим образом:     

  <list >
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>

  </list>
</property>
</bean>

Ответ 4

В классе это нравится

@RequestMapping(value = "/saveData", method = RequestMethod.POST)
 @ResponseBody
    public ResponseEntity<Boolean> saveData(HttpServletResponse response,Bean beanName) throws MyException {
        return new ResponseEntity<Boolean>(uiRequestProcessor.saveData(a),HttpStatus.OK);

}

На странице выполните следующие действия:

<form enctype="multipart/form-data" action="<%=request.getContextPath()%>/saveData" method="post" name="saveForm" id="saveForm">
<input type="text" value="${beanName.userName }" id="username" name="userName" />

</from>

Ответ 5

Вам понадобятся эти импорт...

import javax.servlet.*;
import javax.servlet.http.*;

И, если вы используете Maven, вам также понадобится это в блоке зависимостей файла pom.xml в вашем базовом каталоге проекта.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

Тогда вышеупомянутое исправление Джейсона будет работать:

@ResponseBody
    public ResponseEntity<Boolean> saveData(HttpServletRequest request,
        HttpServletResponse response, Model model){
        String jsonString = request.getParameter("json");
    }

Ответ 6

Вы можете попробовать использовать @RequestBodyParam

@RequestMapping(value = "/saveData", headers="Content-Type=application/json", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<Boolean> saveData(@RequestBodyParam String source,@RequestBodyParam JsonDto json) throws MyException {
    ...
}

https://github.com/LambdaExpression/RequestBodyParam