【问题标题】:why is Spring Boot returning a string instead of JSON为什么 Spring Boot 返回一个字符串而不是 JSON
【发布时间】:2020-04-08 11:17:19
【问题描述】:

根据这个问题,我的方法应该是通过 Jackson 发送一个 JSON 对象:

Returning JSON object as response in Spring Boot

但我在客户端收到一个字符串。

以下是相关部分:

@CrossOrigin(origins = "*")
@RestController
public class AuthController {

 @PostMapping("/api/signup")
    public String signup(HttpServletRequest request, HttpServletResponse response){
      return "{'status':'fail', 'message':'foo'}";
    }
}

【问题讨论】:

  • 废话,我认为它不喜欢单引号。
  • 附带说明,不要重新发明 HTTP。如果注册失败,返回错误代码 (400, 422, 5xx) 和消息,而不是OK 和“不,我不是真的意思好”。 ResponseEntity 是你的朋友。
  • Json没有单引号,要么改正格式,要么也可以使用Map

标签: java json spring spring-boot


【解决方案1】:

虽然您对单引号的看法是正确的,但如果您不想使用 DTO,您可以在不使用 DTO 的情况下实现 JSON 响应。你可以试试这个:

@PostMapping("/api/signup")
public ResponseEntity signup(HttpServletRequest request, HttpServletResponse response) {
    return ResponseEntity
            .status(<http_status>)
            .contentType(MediaType.APPLICATION_JSON)
            .body("{\"status\":\"fail\", \"message\":\"foo\"}");
}

【讨论】:

  • 此处接受的状态无关
  • 我使用了双引号和直 return "{json}" 工作正常,但我接受了你的回答,因为我真的很喜欢你展示的 ResponseEntity 可能性。
  • 谢谢。如果我们不将响应类型设置为application/json,客户端将无法正确解释它。这就是为什么我建议ResponseEntity
【解决方案2】:

您明确地说return "some string";,所以它会按照您的要求执行。

相反,您应该构造一个对象。我将定义以下类和枚举:

public class SignupDto {
    private Status status;
    private String message;

    public SignupDto() {
    }

    public SignupDto(Status status, String message) {
        this.status = status;
        this.message = message;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public enum Status {
        FAIL,
        SUCCESS
    }        
}

并按如下方式使用:

public SignupDto signup(HttpServletRequest request, HttpServletResponse response) {
  return new SignupDto(SignupDto.Status.FAIL, "foo");
}

Jackson 会自动进行序列化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2011-08-15
    • 2019-05-10
    • 2017-09-19
    • 2016-04-27
    • 2018-07-03
    • 1970-01-01
    相关资源
    最近更新 更多