Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring WebFlux筛选器在请求对象反序列化后拦截请求_Java_Spring Boot_Spring Mvc_Spring Webflux_Reactor Netty - Fatal编程技术网

Java Spring WebFlux筛选器在请求对象反序列化后拦截请求

Java Spring WebFlux筛选器在请求对象反序列化后拦截请求,java,spring-boot,spring-mvc,spring-webflux,reactor-netty,Java,Spring Boot,Spring Mvc,Spring Webflux,Reactor Netty,我有一个反应式WebFlux Spring启动应用程序(版本2.2.3.RELEASE)。我已经定义了一个名为SearchRequest的POJO,该POJO用于带注释的控制器中的GET和POST请求: @GetMapping(path = "/search") Mono<ItemCollection> getItems(SearchRequest searchRequest); @PostMapping(value = "/search", consumes = MediaTyp

我有一个反应式WebFlux Spring启动应用程序(版本2.2.3.RELEASE)。我已经定义了一个名为
SearchRequest
的POJO,该POJO用于带注释的控制器中的GET和POST请求:

@GetMapping(path = "/search")
Mono<ItemCollection> getItems(SearchRequest searchRequest);

@PostMapping(value = "/search", consumes = MediaType.APPLICATION_JSON_VALUE)
Mono<ItemCollection> getItemsPost(@RequestBody SearchRequest searchRequest);
其中,
字段
类如下所示:

public class Fields {

    private Set<String> include;
    private Set<String> exclude;
    ...
}
我的
SearchRequest
对象支持使用
bbox
值或
intersects
值进行地理空间查询,但是如果两者都指定,我需要返回400。我尝试了以下方法来实现此验证,但找不到我正在寻找的解决方案:

  • 正在向的
    WebDataBinder
    注册另一个自定义编辑器
    SearchRequest
    未指定字段的类
  • 使用
    WebDataBinder
    注册验证器(使用
    setValidator
    addValidators
    方法)
  • 实现
    WebFilter
  • 解决方案1似乎没有效果。编辑从来没有打过电话。在解决方案2中,每个请求都会调用
    supports
    方法,但从不调用
    validate
    方法。解决方案3可以工作,但需要我编写两组逻辑——一组用于GET,另一组用于POST,因为GET URL参数与POST请求体分开存储。此外,为了实际检查请求正文,
    exchange.getRequest.getBody()
    返回一个
    DataBuffer
    ,可用于将正文反序列化为对象,但如果没有前面提到的属性编辑器(用于GET请求),我无法直接反序列化为
    SearchRequest

    我真的希望找到某种过滤器/转换器/转换器,在请求反序列化为
    SearchRequest
    对象之后,但在调用控制器处理程序方法之前,我可以调用它,但我似乎找不到一种方法来做到这一点


    有人能告诉我这是否可行,或者我唯一的选择是在
    WebFilter
    中单独处理GET/POST请求吗?

    这不是我想要的答案,但至少目前看来是可行的。基本上,我只是做了一个自定义验证器,并在控制器方法中用
    @Valid
    注释了我的
    SearchRequest
    参数

    注释:

    @Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = SingleGeometryValidator.class)
    @Documented
    public @interface SingleGeometry {
        String message () default "Request should not contain both `intersects` and `bbox`. Please choose one geometry to "
                + "search by.";
        Class<?>[] groups () default {};
        Class<? extends Payload>[] payload () default {};
    }
    
    控制器接口:

    @GetMapping(path = "/search")
    Mono<ItemCollection> getItems(@Valid SearchRequest searchRequest);
    
    @PostMapping(value = "/search", consumes = MediaType.APPLICATION_JSON_VALUE)
    Mono<ItemCollection> getItemsPost(@Valid @RequestBody SearchRequest searchRequest);
    
    @GetMapping(path=“/search”)
    Mono getItems(@Valid SearchRequest SearchRequest);
    @PostMapping(value=“/search”,consumes=MediaType.APPLICATION\u JSON\u value)
    Mono getItemsPost(@Valid@RequestBody SearchRequest-SearchRequest);
    
    这不是我想要的答案,但至少目前看来是可行的。基本上,我只是做了一个自定义验证器,并在控制器方法中用
    @Valid
    注释了我的
    SearchRequest
    参数

    注释:

    @Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = SingleGeometryValidator.class)
    @Documented
    public @interface SingleGeometry {
        String message () default "Request should not contain both `intersects` and `bbox`. Please choose one geometry to "
                + "search by.";
        Class<?>[] groups () default {};
        Class<? extends Payload>[] payload () default {};
    }
    
    控制器接口:

    @GetMapping(path = "/search")
    Mono<ItemCollection> getItems(@Valid SearchRequest searchRequest);
    
    @PostMapping(value = "/search", consumes = MediaType.APPLICATION_JSON_VALUE)
    Mono<ItemCollection> getItemsPost(@Valid @RequestBody SearchRequest searchRequest);
    
    @GetMapping(path=“/search”)
    Mono getItems(@Valid SearchRequest SearchRequest);
    @PostMapping(value=“/search”,consumes=MediaType.APPLICATION\u JSON\u value)
    Mono getItemsPost(@Valid@RequestBody SearchRequest-SearchRequest);
    
    @Data
    @SingleGeometry
    public class SearchRequest {
    ...
    }
    
    @GetMapping(path = "/search")
    Mono<ItemCollection> getItems(@Valid SearchRequest searchRequest);
    
    @PostMapping(value = "/search", consumes = MediaType.APPLICATION_JSON_VALUE)
    Mono<ItemCollection> getItemsPost(@Valid @RequestBody SearchRequest searchRequest);