Spring boot 以下划线“开始的绑定请求参数(获取查询)_&引用;访问bean属性

Spring boot 以下划线“开始的绑定请求参数(获取查询)_&引用;访问bean属性,spring-boot,spring-mvc,Spring Boot,Spring Mvc,我需要处理以下请求: http://host/path?_param1=abc&_param2=xxx... 并将它们绑定到bean上,如: @RestController public class Controller { @GetMapping("/path") public String endpoint(@Valid Data data) { ...; } static public class Data { private int _pa

我需要处理以下请求:

http://host/path?_param1=abc&_param2=xxx...
并将它们绑定到bean上,如:

@RestController
public class Controller {

  @GetMapping("/path")
  public String endpoint(@Valid Data data)  {
    ...;
  }

  static public class Data {
    private int _param1;
    private String _param2;
    ...
    public int get_param1() {
      return _param1;
    }

    public void set_param1(int _param1) {
      this._param1 = _param1;
    }
    ...
  }
}
问题是Spring忽略了以下划线“_”开头的属性,或者无法将它们正确绑定到bean。我只是在数据bean中获取空属性。其他属性按预期绑定


有办法处理吗?我无法更改URL和参数名称…

这花费了我一些时间,但我找到了解决方法。Spring binding在默认情况下启用了一种机制来处理缺少的属性值,并将它们与未使用的属性区分开来(即未选中时的http复选框不发送任何参数,但它是在表单中,这种情况应被视为“false”/“null”,与表单元素中没有此类复选框的情况相反)。要做到这一点,每个这样的属性都有前缀为下划线的冗余属性(“checkboxField”有“\u checkboxField”,它是一个隐藏字段,并且总是被发送)。 但处理这些“伙伴”会查找没有下划线前缀的字段,并在找不到时创建一个具有空值的字段

要关闭该机制,必须使用@InitBinder方法:

@RestController
public class MyController {
    @InitBinder
    public void customizeBinding(WebDataBinder binder) {
        binder.setFieldMarkerPrefix(null); //required to handle underscore prefixed fields ("_field")
    }

    @GetMapping(path = "/items")
    String endpoint( @RequestParam("_param") String param ) {
        ... // param is populated with query string "_param"
    }
}

您是否尝试过使用
@JsonProperty
注释,例如
@JsonProperty(“\u param1”)
?它不是json。这些都是简单的GET查询参数…哎呀,没有引起足够的注意。请看这里:。。。他们建议使用
@RequestParam
。我们已经看到了这个问题。我需要绑定到bean属性,而不是每个单独的参数。。。