我的 Spring Boot 项目有一个带有以下请求参数的处理程序:
@RequestParam(value = "release", required = false) Release release
Release
是我定义的一个枚举。我有一个方法,Release.parse(),它将字符串转换为发布。我将其注册在实现 WebMvcConfigurer
的 @Configuration
类中:
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(String.class, Release.class, Release::parse);
}
这对于非空值来说效果很好,但我希望即使没有解析查询参数也能调用此方法(这样我可以将 null 映射到 Release.DEVELOP)。
Spring 类型转换的文档说“对于每次调用 Convert(S),源参数保证不为空。”
那么当参数为空时如何设置转换器?
n.b.我无法在 @RequestParam
注释中使用 defaultValue
来执行此操作,因为这需要一个字符串(并且不允许静态值,所以我不能只读取我的 Release.DEVELOP 枚举)。
最佳答案
Converter
-API 无法执行此操作。最好的解决方案是在 Controller 中执行一些逻辑。最简单的方法是使用可选
API。
@GetMapping
public void handleRelease(@RequestParam Optional<Release> release) {
Release actualRelease = release.orElse(Release.DEV);
}
这样做的好处是它很干净,您不再需要添加 required = false
参数,因为我们使用 Optional
后就隐含了该参数。缺点是您必须在 Controller 方法中执行此操作。
另一种选择是使用不同的转换方法。 Spring MVC 支持 Converter
-API 和使用 PropertyEditor
-API 的转换。
您必须定义一个 PropertyEditor
,而不是创建转换器:
public class ReleasePropertyEditorSupport extends PropertyEditorSupport {
@Override
public void setValue(Object value) {
super.setValue(value == null ? Release.DEV : value);
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(Release.parse(text));
}
}
setAsText()
方法执行转换,但与转换器一样,当值为 null
时不会调用它。
要处理自定义 null
转换,您可以使用自定义 setValue()
setter。
要注册属性编辑器,您必须使用WebDataBinder
。这可以通过将以下方法添加到 Controller 或 Controller 建议来完成:
@InitBinder
public void initializeBinder(WebDataBinder dataBinder) {
dataBinder.registerCustomEditor(Release.class, new ReleasePropertyEditorSupport());
}
关于java - 如何为空值注册 Spring 转换器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71526841/