【问题标题】:how to handle angular's put request of JSON object in spring boot?如何在spring boot中处理angular对JSON对象的put请求?
【发布时间】:2019-10-24 05:45:52
【问题描述】:

我正在尝试模拟this you tube 视频中使用的环境。在这里,他使用this 作为后端来存储和检索来自角度前端的数据。

我想使用 Spring Boot 作为我的支持者做同样的事情,并从前端 (Angular) 进行休息调用。

我已成功获取 GET 请求输出。但无法处理 PUT 请求。

我想向服务器发送一个 JSON 对象,服务器应该使用它来执行一些操作。

客户端

我放置 JSON 对象的 Angular 代码如下所示:

服务

updateTodo(todo:Todo):Observable<boolean>{
   return this.http.put<boolean>('http://localhost:8080/udateJsonData',todo,httpOptions);
}

我的 todo 变量的类定义在上面的 put 请求中是:

型号

export class Todo{
    id:number;
    title:string;
    completed:boolean;
}

HttpOptions

const httpOptions = {
headers: new HttpHeaders({
 'Content-Type': 'application/json'
  })
}

后端

并且在服务器端的 spring boot 中。我有一个休息调用映射方法,如下所示:

请求体(模型)

@XmlRootElement
public class RequestBody {
   @JsonProperty int id;
   @JsonProperty String title;
   @JsonProperty boolean completed;
}

控制器

@RequestMapping(value = "/udateJsonData", method = RequestMethod.PUT)
@Consumes(MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody boolean udateJsonData(RequestBody requestBody) {
  System.out.println(requestBody.title);
  return false;
}

问题是我将系统输出设置为 null
我尝试调试,发现我的 requestBody 本身为空。

任何帮助将不胜感激。 谢谢。

【问题讨论】:

    标签: angular rest spring-boot http put


    【解决方案1】:

    我认为你应该在 Java 中创建一种 POJO 对象(例如TodoDTO),它的结构和类型与 Angular 中的相同。

    然后您在 put 方法参数中使用了@RequestBody 注释:

    @RequestMapping(value = "/udateJsonData", method = RequestMethod.PUT)
    @Consumes(MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody boolean udateJsonData(@RequestBody TodoDTO todo) {
        System.out.println(todo.title);
        return false;
    }
    

    【讨论】:

      【解决方案2】:

      使用@RequestBody注解获取数据

      @RequestMapping(value = "/udateJsonData", method = RequestMethod.PUT)
      @Consumes(MediaType.APPLICATION_JSON_VALUE)
      public @ResponseBody boolean udateJsonData(@RequestBody RequestBody requestBody) {
        System.out.println(requestBody.title);
        return false;
      }
      

      你实际上可以使用 @PutMapping

      @PutMapping(value = "udateJsonData", consumes = MediaType.APPLICATION_JSON_VALUE)
      public boolean udateJsonData(@RequestBody RequestBody requestBody) {
         System.out.println(requestBody.title);
         return false;
      }
      

      【讨论】:

      • 我的浏览器控制台中的错误消息。 “”JSON解析错误:无法构造com.response.RESTMapping$RequestBody的实例(尽管至少存在一个Creator):只能使用默认的无参数构造函数实例化非静态内部类;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造 com.response.RESTMapping$RequestBody 的实例(尽管至少存在一个 Creator):只能使用默认的无参数构造函数在 [Source 实例化非静态内部类: (PushbackInputStream);行:1,列:2]""
      • 无法创建实例Cannot construct instance of com.response.RESTMapping$RequestBodyNo-Arg constructor 添加到RequestBody 中,即public RequestBody() {}
      猜你喜欢
      • 2019-05-19
      • 2016-06-03
      • 2016-01-24
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多