为啥 Spring Boot 返回一个字符串而不是 JSON
Posted
技术标签:
【中文标题】为啥 Spring Boot 返回一个字符串而不是 JSON【英文标题】: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
【参考方案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 会自动进行序列化。
【讨论】:
以上是关于为啥 Spring Boot 返回一个字符串而不是 JSON的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 返回 405 而不是 404 用于 POST 到未知 URL
Spring Boot 控制器建议 - 如何返回 XML 而不是 JSON?