首页 > 解决方案 > 将以下划线“_”开头的请求参数(GET 查询)绑定到 bean 属性

问题描述

我需要处理以下请求:

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-bootspring-mvc

解决方案


这花了我一些时间,但我想出了如何解决它。默认情况下,Spring 绑定已打开机制来处理缺失的属性值并将它们与未使用的属性区分开来(即未选中时的 http 复选框不会发送任何参数,但它是形式的,这种情况应视为“ false"/"null" 与表单元素中没有此类复选框的情况相反)。为此,每个此类属性都具有以下划线前缀的冗余属性(“checkboxField”具有“_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"
    }
}

推荐阅读