【问题标题】:Handle empty flux body in client request处理客户端请求中的空通量体
【发布时间】:2019-12-06 17:38:45
【问题描述】:

我正在 springboot webflux 中创建一个批量插入休息端点,它看起来如下所示,并且按预期工作,除非客户端发送插入 0 个对象的请求。我知道插入 0 个元素对于批量插入来说是一个非常极端的情况,但我希望它静默不做任何事情而不是失败。

package test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@SpringBootApplication
@RestController
public class Application {    
    private static final Logger log = LoggerFactory.getLogger(Application.class);


    public static void main(String[] args) {
        // ignore args and just enable debug mode
        SpringApplication.run(Application.class, args);
    }

    @PostMapping("/insert")
    @ResponseBody
    public static Mono<Void> insert(@RequestBody Flux<MyObject> objects) {
        // implementation details not important
        return objects
            .doOnNext(obj -> log.info("inserting: " + obj.value))
            .then();
    }

    public static class MyObject {
        // actual contents not important
        public String value;
    }
}

运行curl -XPOST -H"Content-Type: application/stream+json" localhost:8080/insert 将在服务器日志中生成以下内容:

2019-12-06 12:30:27.217 DEBUG 18372 --- [ctor-http-nio-7] o.s.w.s.adapter.HttpWebHandlerAdapter    : [137c5b5c] HTTP POST "/insert"
2019-12-06 12:30:27.218 DEBUG 18372 --- [ctor-http-nio-7] s.w.r.r.m.a.RequestMappingHandlerMapping : [137c5b5c] Mapped to test.Application#insert(Flux)
2019-12-06 12:30:27.219 DEBUG 18372 --- [ctor-http-nio-7] .r.m.a.RequestBodyMethodArgumentResolver : [137c5b5c] Content-Type:application/stream+json
2019-12-06 12:30:27.219 DEBUG 18372 --- [ctor-http-nio-7] .r.m.a.RequestBodyMethodArgumentResolver : [137c5b5c] 0..N [test.Application$MyObject]
2019-12-06 12:30:27.221 DEBUG 18372 --- [ctor-http-nio-7] a.w.r.e.AbstractErrorWebExceptionHandler : [137c5b5c] Resolved [ServerWebInputException: 400 BAD_REQUEST "Request body is missing: public static reactor.core.publisher.Mono<java.lang.Void> test.Application.insert(reactor.core.publisher.Flux<test.Application$MyObject>)"] for HTTP POST /insert
2019-12-06 12:30:27.221 DEBUG 18372 --- [ctor-http-nio-7] o.s.http.codec.json.Jackson2JsonEncoder  : [137c5b5c] Encoding [{timestamp=Fri Dec 06 12:30:27 EST 2019, path=/insert, status=400, error=Bad Request, message=Reques (truncated)...]
2019-12-06 12:30:27.222 DEBUG 18372 --- [ctor-http-nio-7] o.s.w.s.adapter.HttpWebHandlerAdapter    : [137c5b5c] Completed 400 BAD_REQUEST

我不明白的是,为什么当日志清楚地表明它被路由到 test.Application#insert(Flux) 并以 0..N [test.Application$MyObject] 作为请求正文时会导致 BAD_REQUEST,这表明具有 0 个元素的正文应该是有效的。

【问题讨论】:

    标签: java spring-boot spring-webflux


    【解决方案1】:

    可能是@RequestBody(required = false)

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 2023-01-14
      • 2019-06-03
      • 2017-07-10
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      相关资源
      最近更新 更多