Spring API должен возвращать JSON вместо экранированной строки - PullRequest
2 голосов
/ 03 мая 2019

У меня есть конечная точка Spring, которая должна возвращать JSON, чтобы ее можно было свернуть / развернуть через Chrome. Есть ли способ сообщить Spring, что строка в сообщении является фактическим представлением Json, и нет необходимости экранировать двойные кавычки

Объявление конечной точки:

@GET
@Path("/validate/{id}")
@Produces("application/json")
Response validate(@Context HttpServletRequest request, @PathParam("id") String id);    

Реализация конечной точки:

public Response validate(HttpServletRequest request, String id) {
    try {
          return validatorService.validate(request, String id);
    } catch(Exception e) {
          throw new MyCustomException(e);
    }
}

Обработчик исключений:

public class ExceptionHandler implements ExceptionMapper {

    @Override
    public Response toResponse(MyCustomException exception) {
        String json = buildJsonResponse(exception);
        Message message = new Message(json);
        return Response.status(ERROR_HTTP_STATUS_CODE).entity(response).build();
    } 
 }


public class Message {
     String json;

     public Message(String json) {
         this.json = json;
     }

     public String getJson() {
        return json;
     }

}

Ответ:

   "json": "{  \"key\":  \"value\" }"

Ожидаемый ответ:

   "json": { "key":  "value" }

Решение:

 private JsonNode convertToJson(String json) {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.readTree(json);
        } catch (IOException e) {
            return NullNode.getInstance();
        }
    }

1 Ответ

1 голос
/ 03 мая 2019

Вы конвертируете свой объект в строку в формате json. Spring просто возвращает строковое значение в параметре json. Если вы хотите вернуть форматированный объект json, а не строку, не конвертируйте ваш объект в строку (json). Преобразуйте ваш json в Object type и удалите строку ниже.

String json = buildJsonResponse(exception);

Если вы хотите вернуть пользовательский json в строковом параметре, преобразуйте весь объект в json, а не только в его переменную.

Вы можете просто вернуть строку из вашего оставшегося API, используя такой параметр, который вы добавили. produces = "application/json"

...