gpt4 book ai didi

spring - 检查 Controller 或服务层中的先决条件

转载 作者:IT老高 更新时间:2023-10-28 13:53:35 24 4
gpt4 key购买 nike

我正在使用 Google 的 Preconditions 类来验证用户的输入数据。
但我担心使用 Preconditions 类检查用户输入数据的最佳点在哪里。
首先,我在 Controller 中编写了验证检查代码,如下所示:

@Controller
...
public void register(ProductInfo data) {
Preconditions.checkArgument(StringUtils.hasText(data.getName()),
"Empty name parameter.");
productService.register(data);
}

@Service
...
public void register(ProductInfo data) {
productDao.register(data);
}

但我认为服务层中的 register 方法将使用另一个 Controller 方法,如下所示:

@Controller
...
public void register(ProductInfo data) {
productService.register(data);
}
public void anotherRegister(ProductInfo data) {
productService.register(data);
}

@Service
...
public void register(ProductInfo data) {
Preconditions.checkArgument(StringUtils.hasText(data.getName()),
"Empty name parameter.");
productDao.register(data);
}

另一方面,服务层的方法将只在一个 Controller 中使用。
我很困惑。在 Controller 或服务中检查先决条件的更好方法是什么?
提前致谢。

最佳答案

理想情况下,您会在两个地方都这样做。但是您混淆了两件事:

  • 验证(带错误处理)
  • 防御性编程(又名断言,又名契约(Contract)设计)。

您绝对应该在 Controller 中进行验证,并在您的服务中进行防御性编程。这就是原因。

您需要对表单和 REST 请求进行验证,以便将合理的错误发送回客户端。这包括哪些字段不好,然后对错误消息进行本地化等...(如果 ProductInfo.name 属性为空,您当前的示例将向我发送带有堆栈跟踪的可怕 500 错误消息)。

Spring 有一个 solution for validating objects在 Controller 中。

防御性编程是在服务层完成的,但不是验证,因为您无权访问语言环境来生成正确的错误消息。有些人会这样做,但 Spring 并不能真正帮助您。

没有在服务层进行验证的另一个原因是 ORM 通常已经通过 JSR Bean 验证规范(休眠)进行了验证,但它不会生成合理的错误消息。

人们采用的一种策略是创建自己的前置条件实用程序库,该库会抛出自定义派生的 RuntimeException,而不是 guava(和 commons lang)的 IllegalArgumentExceptionIllegalStateException 然后 try...catch 将 Controller 中的异常转换为验证错误消息。

关于spring - 检查 Controller 或服务层中的先决条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11929781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com