【问题标题】:Create a new Object with @RequestBody(required=false)使用 @RequestBody(required=false) 创建一个新对象
【发布时间】:2017-11-08 08:35:24
【问题描述】:

我有一个带有可选 @RequestBody 参数的 Rest Controller,如果用户没有指定它,我想初始化它。现在我正在这样做:

@PostMapping
public ResponseEntity<Page<?>> findAll(
            @RequestBody(required=false) MyRequest request,
            Pageable pageable
        ) {
  if (request == null) {
    request = new MyRequest();
  }
...
}

是否有任何自动方式告诉 Spring MVC,如果参数为 null,它必须创建一个新对象?

【问题讨论】:

  • 我猜它确实创建了一个新对象,如果请求正文为空,它不会初始化它。
  • 问题是,如果我没有像我一样专门创建一个新对象,如果我尝试访问一个对象的方法,就会弹出空指针异常
  • 如果没有请求正文,那么它不应该是POST 调用,为什么不创建一个单独的GET 具有相同映射的端点呢?我认为这是最合适的解决方案。
  • 我已经有一个,但我还需要验证这个

标签: spring spring-mvc spring-boot


【解决方案1】:

我没有完全控制 Spring,但我认为没有一种自动方法来初始化这样的对象。如果正文为空,则消息转换器使用null 值初始化对象。这就是为什么你有一个NPE。 您可以使用 Java 8 Optional&lt;Myrequest&gt;,即使我从未在这种情况下使用过它,我很想知道消息转换器如何处理这种情况。如果你测试它,请告诉我。

【讨论】:

    【解决方案2】:

    记住@RequestBody 调用了MyRequest 的空构造函数。因此request总是 引用该类的实例。

    结论:request == nullrequest.equals(null) 无法评估为真。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多