My Spring Boot项目有一个带有以下请求参数的处理程序:
@RequestParam(value = "release", required = false) Release release
Release
是我定义的枚举。我有一个方法,Release.parse((,它将String转换为Release。我将其注册在实现WebMvcConfigurer
:的@Configuration
类中
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(String.class, Release.class, Release::parse);
}
这对于非null值来说很好,但我希望即使在没有解析查询参数的情况下也能调用此方法(这样我就可以将null映射到Release.DEVELOP(
Spring类型转换的文档说;对于每个convert(S(调用,保证源参数不为null">
那么,当参数为null时,我该如何设置转换器呢?
n.b.我不能在@RequestParam
注释中使用defaultValue
,因为这需要一个String(并且不允许静态值,所以我不能只从Release.DEVELOP枚举中读取(。
Converter
-API没有办法做到这一点。最好的解决方案是在控制器中执行一些逻辑。最简单的方法是使用Optional
API。
@GetMapping
public void handleRelease(@RequestParam Optional<Release> release) {
Release actualRelease = release.orElse(Release.DEV);
}
这样做的好处是它是干净的,您不再需要添加required = false
参数,因为这是隐含的,因为我们使用了Optional
。缺点是,您将不得不在非常控制器的方法中这样做。
另一种选择是使用不同的转换方法。SpringMVC支持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
。这可以通过向控制器或控制器建议添加以下方法来实现:
@InitBinder
public void initializeBinder(WebDataBinder dataBinder) {
dataBinder.registerCustomEditor(Release.class, new ReleasePropertyEditorSupport());
}