java - 如何为空值注册 Spring 转换器?

标签 java spring-boot spring-mvc converters

我的 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/

相关文章:

spring-mvc - Spring 安全 : allow user only to access their own administration page

java - 使用 Spring Rest Controller

java - 有没有办法检查哪个程序正在连接到套接字?

java - 在 Java 中解析 JavaScript 代码以检索变量的名称

java - 在 REST API 请求中包含 URL 地址时 RestTemplate 出现问题

spring - 在 gradle 测试命令行中使用 -Dspring.config.name 和 -Dspring.config.location

spring-mvc - 在 spring mvc @ResponseBody 中返回文字 JSON 字符串

java - 具有基本安全性的 REST Web 服务的 Android 客户端

java - Channel.id()在netty4.0最终版本中被删除了,如何解决?

java - hibernate搜索中的OnFields方法接受什么数据类型