spring-boot - 将以下划线“_”开头的请求参数(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 绑定已打开机制来处理缺失的属性值并将它们与未使用的属性区分开来(即未选中时的 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"
}
}
推荐阅读
- c# - 对具有最大值配置的 WCF 服务的影响
- arrays - 在 vb.net 中,我们如何在不初始化的情况下获取任何数组值?
- reactjs - 在 react-select 中选择父选项时出现问题
- flutter - 在容器内颤动文本
- java - 此版本中使用了弃用的 Gradle 功能,使其与我的 Windows 中的 Gradle 7.0 不兼容,我使用 6.8.2 进行 gradle
- asp.net-mvc - 如何使用richtextbox在mvc5中保存项目符号列表数据
- python - 使用 python 的 Linkpulse api
- c# - 将浮点数反序列化为“浮点”类型,而不是 Json.NET 中的默认“双精度”
- python - 使用 Spark 将值数组格式化为串联字符串
- ios - 无法同时满足约束。(自动布局)