如何为null值注册Spring转换器



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没有办法做到这一点。最好的解决方案是在控制器中执行一些逻辑。最简单的方法是使用OptionalAPI。

@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());
}

最新更新