我正在尝试找出一种干净的方法来管理 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>
。将填写这两个( Pet
或 Error
)之一。调用者需要弄清楚是哪一个。我只是在这里给您一个选择,这不是我在惯用的 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/