#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 objectmembers
должен быть уникальным, читайте 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. Если это поможет или решит ваши запросы, пожалуйста, подумайте о том, чтобы принять ответ и проголосовать за него, чтобы другие могли найти его полезным.