【问题标题】:Spring Data REST Bean ValidationSpring Data REST Bean 验证
【发布时间】:2016-03-02 20:13:37
【问题描述】:

考虑一个Person 实体,其属性name 被注释为@NotNull。然后是一个简单的PersonRepository,这个 repo 暴露在 Spring Data Rest 中。

当我POST 创建一个新的Person 时,如果name 属性为null,则ValidationException 按预期发生。但我在客户端上实际得到的是 Internal Server Error (500),而消息是 TransactionSystemException,发生在异常链的后面。

我希望得到的是一个 Bad Request (400),其中包含实际的 ValidationException 以及所有有用的信息,因此客户可以知道发布的数据有什么问题。

正如here 所解释的那样,似乎有一种方法可以将自定义验证器与 SDR 连接起来。但问题是,这不是自定义验证器,它是在要求存储库保存数据时发生的标准 bean 验证。所以我不太确定这两者是如何结合在一起的。

所以问题:

  1. 在使用 SDR 时,我有哪些选项可以让客户知道提交的数据有什么问题?诸如哪些字段无效以及每个字段的错误是什么之类的东西会很棒。
  2. 在任何地方都有这方面的例子吗?

非常感谢。

【问题讨论】:

    标签: java spring validation rest spring-data-rest


    【解决方案1】:

    您需要的是一个合适的ExceptionHandler,它将处理后端异常并将有意义的丰富消息(json/xml)发送到前端客户端。

    看看这个git repository

    【讨论】:

    • 这看起来是解决我的问题的正确方法,并且链接的库很棒。如果我可能滥用这个问题,那只是一件事。在我的具体情况下,我的异常链如下所示:ConstraintViolationException -> RollbackException -> TransactionSystemException。我想针对ConstraintViolationException,而不是其他人。那么spring会考虑哪个异常:根异常还是链中的最后一个异常?
    • @user1387786 当然,您的目标是主要异常,它是链中的最后一个异常,在 spring Data 中它将是 DataIntegrityViolationException 或者如果您直接使用休眠,它将是 ConstraintViolationException
    • 看起来这在 SDR 上不起作用,因为异常被包装了。 github.com/jirutka/spring-rest-exception-handler/issues/5.
    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 2014-08-10
    • 2016-05-21
    • 2020-05-13
    • 2020-04-26
    • 2018-08-22
    • 2013-04-16
    相关资源
    最近更新 更多