【问题标题】:How to catch @RequestParams when the user pass a empty value当用户传递空值时如何捕获@RequestParams
【发布时间】:2019-06-15 05:19:16
【问题描述】:

我正在尝试用 kotlin 做一个 Spring MVC RestController, 但我在使用 LocalDatetime 的 RequestParams 时遇到了困难

@GetMapping
fun getParams(@RequestParam(required = true) endDate: LocalDateTime)

如果我没有指定参数localhost:8080/,它会给出一个可以在ControllerAdvice 中捕获的错误,但是如果我指定一个空值localhost:8080/endDate=,它会给我 java.lang.IllegalArgumentException: Parameter specified as non-null is null: method net.agroop.deviceapi.controllers.DeviceController.getAirParams, parameter endDate

我认为无法在 ControllerAdvice 中捕获该错误,因为这是一个 kotlin 错误。

我尝试过使用其他类型,如 Date ,它也给出了错误。如果我使用 String 它可以工作,因为 String 可以为空。 另外,如果我指定 LocalDateTime?因为它可以为空,但我必须在每个 RequestMapping 中捕获控制器中的错误,而不是在 ControllerAdvice 中。

【问题讨论】:

  • 您是否设置了@ControllerAdvice
  • 将参数指定为可为空,或者在注解中给它一个默认值。
  • 不要使用@RequestParam,而是使用具有endDate 字段的表单对象,并使用@NotNull 等常规验证规则来验证表单。这也与 Spring I18N 集成,您也可以提供很好的错误消息。
  • 是的@RoddyoftheFrozenPeas 我已经设置了它,如果我不传递参数或无效日期,它会缓存,但如果参数传递但为空/null,则不会缓存
  • 我知道@gidds,但我正试图捕捉 ControllerAdvice 中的所有错误

标签: spring spring-boot spring-mvc kotlin


【解决方案1】:

我自己想通了。 只需要一个Converter<S, T> 组件来处理日期转换

@Component
class LocalDateConverter : Converter<String, LocalDateTime> {
    override fun convert(source: String): LocalDateTime = LocalDateTime.parse(source, DateTimeFormatter.ISO_DATE_TIME)
}

现在我可以使用以下方法处理异常:

@ExceptionHandler(MethodArgumentTypeMismatchException::class)
fun handleMethodArgumentTypeMismatch(ex: MethodArgumentTypeMismatchException, request: WebRequest) =

【讨论】:

    【解决方案2】:

    要摆脱异常,只需将你的模型的属性设为null,即endDate: LocalDateTime?

    @GetMapping
    fun getParams(@RequestParam(required = true) endDate: LocalDateTime?)
    

    要验证空值,您可以在 data class 中使用 @field:NotEmptyHibernate Validator

    GL

    Source

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多