【问题标题】:How to return JSON from serialized JSON in Spring Rest Controller如何从 Spring Rest Controller 中的序列化 JSON 返回 JSON
【发布时间】:2020-09-22 17:22:01
【问题描述】:

我有一个代表 JSON 的String

[{"type":"ERROR","message":"some error message"}]

ex.contentUTF8() 在以下代码中返回此 String

@RestControllerAdvice
@RequiredArgsConstructor
public class ControllerExceptionHandler {

    @ExceptionHandler(FeignException.class)
    @ResponseBody
    public String afterThrowing(FeignException ex, HttpServletResponse response) {
        response.setStatus(ex.status());
        return ex.contentUTF8();
    }

}

虽然 HTTP 客户端没有收到 JSON 响应。相反,它会获取带有响应正文的 HTML,即String。我怎样才能返回 JSON?我需要反序列化那个String吗?

更新

对客户端的响应必须完全是表示(将被序列化为)Stringex.contentUTF8() 返回的 JSON 对象:

[{"type":"ERROR","message":"some error message"}]

因此,像 ErrorDto(在一些答案中提供)这样的包装对象将不起作用。

【问题讨论】:

    标签: json spring spring-boot spring-mvc spring-cloud-feign


    【解决方案1】:

    您应该返回一个适合您的 JSON 表示的对象:

    public class ErrorDto {
        private String type;
        private String message;
    }
    

    还有:

    @RestControllerAdvice
    @RequiredArgsConstructor
    public class ControllerExceptionHandler {
    
        @ExceptionHandler(FeignException.class)
        @ResponseBody
        public ErrorDto afterThrowing(FeignException ex, HttpServletResponse response) {
            return new ErrorDto("your type", "your message");
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      根据@Fabien 的回答,您可以使用ResponseEntity<Object> 类来返回application/json 内容类型响应。使用ResponseEntity 基本上可以控制响应的各个方面。

      你可以试试这样的:

      @ExceptionHandler(FeignException.class)
      public ResponseEntity<Object> afterThrowing(FeignException ex) {
          ErrorDto payload = new ErrorDto(ex.status(), ex.contenUTF8());
          return ResponseEntity
                  .status(ex.status())
                  .contentType("application/json")
                  .body(payload);
      }
      

      【讨论】:

        猜你喜欢
        • 2012-07-09
        • 2019-09-26
        • 2012-06-01
        • 2015-12-30
        • 1970-01-01
        • 2018-12-08
        • 2021-05-16
        • 1970-01-01
        • 2014-03-23
        相关资源
        最近更新 更多