java - 如何在没有副作用的情况下提供有意义的验证错误反馈?

标签 java validation rest

我正在尝试找出一种干净的方法来管理 REST 端点的验证,这将使我能够在出现错误(HTTP 状态代码和一些错误消息)时向用户提供有意义的反馈,同时避免也在执行工作的验证方法中产生副作用。

例如,我需要解析传入的 json 对象,首先我需要验证它是否解析并获取代表它的对象。如果我在解析过程中遇到异常,那么我想告诉用户,但如果解析正确,我也想从验证方法中获取对象。

这里有两个问题,验证和将 json 字符串转换为 POJO。如果我将它们放在同一个方法中,那么如果解析失败,如何返回错误字符串而不产生副作用?

super 伪代码显示了一种可能性,但有副作用:

public Pet parsePet(HTTPResponse httpResponse, String petStr) {
    Pet pet = null;
    try {
        Parser parser = new Parser();
        pet = parser.parse(petStr, Pet.class);
    } catch(Exception e) {
        httpResponse.setStatus(400);
    }
    return pet;
}

显然,在这种情况下,我可以使用空响应来确定它没有解析并避免副作用,但在更复杂的示例中,不同的错误会产生不同的错误状态'如何避免副作用?

对于此类事情是否有一些标准的最佳实践或架构概念?

我能想到的“最干净”的选项是抛出一些新的异常,例如 ValidationException(int statusCode)当违反业务规则时可能会抛出该异常。但随后“异常(exception)是针对特殊的事情”就开始发挥作用了。考虑到我最终会向用户返回一个错误,看来这里的异常在某种程度上是可以接受的。

最佳答案

If I put them in the same method then how to I return the error string if the parsing fails without having a side effect?

发生错误时抛出异常。更高层的东西会解释它并将其转换为 http 错误响应。

来自 Haskell 世界的其他事情你可以做的是让这个方法返回 Either<Pet, Error> 。将填写这两个( PetError )之一。调用者需要弄清楚是哪一个。我只是在这里给您一个选择,这不是我在惯用的 Java 代码中看到的东西。

The "cleanest" option I could think of is to throw some new exception like ValidationException(int statusCode)

我认为扔一个 PetParsingException 会更干净一些。更高层的东西解释异常并确定它是 400。您的验证不必知道它是 Restful api 的一部分。

关于java - 如何在没有副作用的情况下提供有意义的验证错误反馈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30242147/

相关文章:

java - jsp无法用空格替换%20?

java - 使用 Commons Digester 解析 Subversion XML 输出时出现的问题

validation - 如何在 Angular4 中实现自定义异步验证器

ruby-on-rails - 将默认值添加到 *_path 方法生成的路由的前缀中

java - 使用 JAXB 解码嵌套元素

rest - 使用哪个 Logback Appender 通过 REST 接收器端点将新事件发送到 splunk?

java - Java 中的 C++ 样式多态输出

java - 使用 ViewerComparator 对 SWT 表进行排序从不调用比较

javascript - Strongloop 环回验证和请求生命周期

javascript - 当文本框有效时隐藏弹出窗口