我需要处理以下请求:
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和参数名称...
答案 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"
}
}