java - 是否可以让空的 RequestParam 值使用 defaultValue?

标签 java spring spring-mvc

如果我有一个类似于以下的请求映射:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", defaultValue = "10") int i) {
}

然后调用这个请求:

http://example.com/test?i=

我收到错误消息

Failed to convert value of type 'java.lang.String' to type 'int'; nested exception is java.lang.NumberFormatException: For input string: ""'

我可以通过阻止 javascript 客户端发送空参数来解决此问题,或者通过接受字符串值并仅在未发现它们为空时进行解析。

更新:更高版本的 spring 现在实现了最初期望的行为。

我刚刚在 spring 4.3.5 中对此进行了测试,发现现在的行为实际上会将 null 值转换为默认值,而不会引发 NumberFormatException,因此;我的原始映射现在可以正常工作了。

我不确定这种行为改变是哪个版本的 spring。

最佳答案

您可以将 @RequestParam 类型更改为 Integer 并使其不需要。这将使您的请求成功,但它将为空。您可以在 Controller 方法中将其显式设置为默认值:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", required=false) Integer i) {
    if(i == null) {
        i = 10;
    }
    // ...
}

我已经从上面的示例中删除了 defaultValue,但是如果您希望收到根本没有设置的请求,您可能需要包含它:

http://example.com/test

关于java - 是否可以让空的 RequestParam 值使用 defaultValue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12296642/

相关文章:

java - 如何使用 ANTLR 4 实现逻辑运算符(and、or)?

Spring MVC + DataTables 1.10 参数绑定(bind)

java - 如何正确地将许多服务注入(inject) Spring MVC Controller ?

java - 嵌套异常是 java.lang.NoClassDefFoundError : org/slf4j/impl/MessageFormatter

java - 从 JSON 负载中获取特定属性作为 MVC 方法参数

java - 仅在外部 Tomcat 上运行时出现 Spring Boot Thymeleaf 错误

Java:未使用最新版本的文件(在程序执行期间修改)

java - GridLayout 错误

java - 如果服务器收到 0 作为端口号,如何中继 NAT 动态端口号?

java - spring - jSTL - 错误 404 - 请求的资源不可用