【问题标题】:LocalDate validation issueLocalDate 验证问题
【发布时间】:2021-12-13 20:24:21
【问题描述】:

我在这个问题上纠结了一段时间。我正在使用 LocalDate 通过 REST 端点接受用户的日期输入。我想验证此日期以检查它是nullempty 字符串还是invalid 日期,例如Feb 30。我已经设法让它适用于有效的日期值,但如果输入无效,它会抛出 400 Bad Request 作为响应,它来自 Java 的内部类,所以我无法控制它。如果你能告诉我我是否遗漏了什么或做错了什么,我将非常感激。

这在我的控制器中被称为方法 - 用 @Valid 注释:

@RequestMapping(method = RequestMethod.PUT, value="/add")
public ResponseEntity<PSResponse> add(@Valid @RequestBody PSRequest request) throws Exception {
    setServiceID(SERVICE_HANDLER_ID);
    request.setRequestType("add");
    PSResponse response = (PSResponse) invokeInternal(request);
}

这是我的请求对象的类

public class PSRequest {
@NotNull(message = "fromDate cannot be null")
protected LocalDate fromDate;

@NotNull(message = "toDate cannot be null")
protected LocalDate toDate;}

有效的 JSON 输入

"fromDate":2020-10-16"
"toDate":"2021-10-16"

无效的 JSON 输入日期格式

"fromDate":null,
"toDate":"2021-02-30"

谢谢!

【问题讨论】:

  • 日期格式是 ISO 9601 吗?您是否需要验证从和到日期之间的某些顺序关系?顺便说一句,您的有效 JSON 示例中似乎缺少引号。

标签: java date validation localdate


【解决方案1】:

您的操作没有任何问题,收到400 bad request 是正常的。 为什么?因为您正在使用基于 Http 协议的 Rest Endpoint

Bad request 表示您的Http 请求不正确,原因有很多,例如:参数无效。最佳实践是向用户发送一条明确的消息,解释他向服务器发送请求后发生的情况。为此,您可以使用RestControllerAdvice 拦截所有异常并将其映射到Http 状态代码。

查看this post了解更多详情。

【讨论】:

  • 输入中还有很多其他字段可能导致 400 错误请求。因此,我想控制我的代码,以便我可以向用户发送特定于这些日期字段的自定义消息。将这些日期定义为字符串,我可以做到。但是对于 LocalDate 数据类型,Java 甚至在它到达我的代码并抛出这个 400 之前就获得了控制。这就是为什么我在我的请求中添加了 @NotNull 注释但没有帮助。
  • 如果你真的知道你的用例,你可以通过显式抛出它来处理异常。如果 Java 处理此异常,则有任何问题。您可以在 RestControllerAdvice 中处理此异常并返回自定义消息。
【解决方案2】:

为了抑制内置验证,您可以从前端接收String,然后才执行您的代码:LocalDate.parse(fromDate),捕获DateTimeParseException 并按照您的意愿处理。

另一种选择是删除@Valid

顺便问一下,@Valid 有什么问题?难道你不想得到400的回报吗?!或者您想用 400 控制正文消息?

【讨论】:

  • 我想控制我的代码,因为 400 也可能由于其他原因而发生。输入中还有很多其他字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多