【问题标题】:Post JSON to backend将 JSON 发布到后端
【发布时间】:2017-10-20 08:59:22
【问题描述】:

我正在开发一个 Spring Boot 应用程序,现在想将用户详细信息发布到后端。我通过以下代码将 Json 数据发布到后端:

@RestController
    public class  DataInsertController {


        @RequestMapping(value = "data/api", consumes={MediaType.APPLICATION_JSON_VALUE},method = RequestMethod.POST)
        public ResponseEntity<HostResponse> createAuthenticationToken(@RequestBody Host host )  {

            System.out.println(host.getName());

            return ResponseEntity.ok(new HostResponse("token"));
        }

    }

我的对象类是这样的

import java.io.Serializable;

public class Host implements Serializable{

private static final long serialVersionUID = -8445943548965154778L;


private String name;
private String email;
public Host(){
    super();
}
  public Host(String name, String email) {
        this.setName(name);
        this.setEmail(email);
    }

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getEmail() {
    return email;
}
public void setEmail(String email) {
    this.email = email;
}


}

我正在发布类似

的数据
{
"name": "user01",
"email":"user1@email.com"
}

来自我的 Rest Client。但是后端没有打印数据。任何帮助表示赞赏。

【问题讨论】:

  • (没有我的 IDE)我没有发现任何问题,但我会删除一些内容,例如 consumes={MediaType.APPLICATION_JSON_VALUE} 和对象类中的构造函数。尝试不使用它并告诉我它是否有效:)
  • 实际上当我打印System.out.println(host.getName());时。它打印 nul。知道为什么吗?如何将接收到的 json 数据检索到 java 对象值?
  • 我测试你的代码。没有错误。有用。可能是您的客户端请求格式不正确。可以分享一下吗?
  • 实际上我没有开发任何前端。所以我正在尝试使用 Advanced Rest Client 将名称和电子邮件作为 HTTP 标头传递

标签: java json post spring-boot


【解决方案1】:

如果您使用 Postman 发送数据,请在正文部分而不是标题中发送数据,因为您已使用 @RequestBody 获取数据。

这会解决你的问题

【讨论】:

    【解决方案2】:

    您需要使用 Jackson Annotations 注释您的类,否则它将不知道要反序列化哪个字段:

    @JsonCreator
      public Host((@JsonProperty("name")String name,@JsonProperty("email") String email) {
            this.setName(name);
            this.setEmail(email);
        }
    

    【讨论】:

      【解决方案3】:

      我使用如此有效的解决方案将帖子正文作为 json。您可以使用 ObjectMapper 将正文作为字符串并将其转换为您的对象(主机类),如下所示:

      @RestController
          public class  DataInsertController {
      
      
              @RequestMapping(value = "data/api", consumes={MediaType.APPLICATION_JSON_VALUE},method = RequestMethod.POST)
              public ResponseEntity<HostResponse> createAuthenticationToken(@RequestBody Map<String,Object> hostMap )  {
      
                   // handle json object exceptions to validate input
                  JSONObject jsonObject = new JSONObject(hostMap);            
                  Host host = new ObjectMapper().readValue(jsonObject.toString()  , Host.class);
      
                  System.out.println(host.getName());
                  return ResponseEntity.ok(new HostResponse("token"));
              }
      }
      

      【讨论】:

      • 我认为不需要,因为 Spring 使用 Jackson JSON 库自动将实例编组为 JSON
      • 是的,它不是必需的,但对于无效的主体返回弹簧返回错误。通过使用 Jackson JSON 库,您可以处理输入并根据输入正文返回适当的响应
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 2012-10-05
      • 1970-01-01
      相关资源
      最近更新 更多