将下划线“ _”开头的请求参数(GET查询)绑定到bean属性

时间:2019-12-20 16:55:55

标签: 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 _param1;
    private String _param2;
    ...
    public int get_param1() {
      return _param1;
    }

    public void set_param1(int _param1) {
      this._param1 = _param1;
    }
    ...
  }
}

问题是Spring忽略以下划线“ _”开头的属性,或者无法将它们正确绑定到Bean。我只是在数据bean中获取空属性。其他属性已按预期进行绑定。

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

1 个答案:

答案 0 :(得分:0)

这花了我一些时间,但我想出了解决方法。春季绑定默认情况下已启用机制,以处理缺失的属性值并将其与未使用的属性区分开(即,未选中时的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"
    }
}