Как сгенерировать настроенный ответ JSON с помощью Spring Boot REST?

#java #json #rest #spring-boot

#java #json #rest #spring-boot

Вопрос:

Я разрабатываю веб-сервисы Restful с помощью Spring boot. И операции CRUD отлично работают с ним. Но внезапно появилось новое требование, согласно которому ответ должен быть в определенном формате JSON.

Я получаю этот ответ —

     "user": {
              "id": 123,
              "name": "shazow"
          }
  

Но требование примерно такое —

     {
       "Timestamp": "2007-10-27T00:51:57Z"
       "status": "ok",
       "code": 200,
       "messages": [],
       "result": {
           "user": {
              "id": 123,
              "name": "shazow"
            }
        }
    }
  

Кроме того, если мы извлекаем всех пользователей, тогда это должно быть —

     {
       "Timestamp": "2007-10-27T00:51:57Z",
       "status": "ok",
       "code": 200,
       "messages": [],
       "users"[
           "user": {
                 "id": 123,
                 "name": "Shazow"
               },

           "user": {
                 "id": 101,
                 "name": "James"
               },

           "user": {
                "id": 152,
                "name": "Mathew"
               }
          ]     
     }
  

Пожалуйста, помогите, заранее спасибо.

Комментарии:

1. CRUD работает, значит, вы уже сопоставляете объекты Java с json? Есть ли у вас что-то вроде ObjectMapper на месте? Если да, то почему бы вам просто не создать объектную структуру вашего json и сопоставить это?

2. Да, я сопоставил Json с bean с помощью Jackson. Но не знаю, как сопоставить эти дополнительные детали с ним. Я все еще новичок в Spring rest.

3. Вам нужно, чтобы эти поля отображались в определенном порядке в вашем выходном json?

4. да, это верно

5. Подсказка : ваш JSON недействителен. "users" это массив, а не объект, и name of object members должен быть уникальным, читайте tools.ietf.org/html/rfc7159#section-4

Ответ №1:

Вы можете написать метод, подобный тому, который я называю обработчиком ответа, в любом классе, а затем задать в нем свой ответ по своему усмотрению. Пожалуйста, посмотрите код ниже:

    public class ResponseHandler {

    public static ResponseEntity<Object> generateResponse(HttpStatus status, boolean error,String message, Object responseObj) {
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            map.put("timestamp", new Date());
            map.put("status", status.value());
            map.put("isSuccess", error);
            map.put("message", message);
            map.put("data", responseObj);

            return new ResponseEntity<Object>(map,status);
        } catch (Exception e) {
            map.clear();
            map.put("timestamp", new Date());
            map.put("status", HttpStatus.INTERNAL_SERVER_ERROR.value());
            map.put("isSuccess",false);
            map.put("message", e.getMessage());
            map.put("data", null);
            return new ResponseEntity<Object>(map,status);
        }
    }
}
  

Пример использования :

  @RestController
public class UtilityController {

    private static Logger LOGGER = LoggerFactory.getLogger(UtilityController.class);

    @RequestMapping("/test")
    ResponseEntity<Object> getAllCountry() {
        LOGGER.info("Country list fetched");
        return ResponseHandler.generateResponse(HttpStatus.OK, false, "Success", null);
    }

}
  

Если у вас есть какие-либо другие запросы, пожалуйста, дайте мне знать.

Комментарии:

1. Нужно ли нам аннотировать этот класс? @pawan

2. Нет. Это простой класс со статическим методом. Просто используйте classname.methodname я добавил пример.

3. Что здесь messgeService? Это класс?

4. Чтобы добавить сообщение об этом ответе. Теперь вы можете использовать подобное.

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