春天的验证者应该访问数据库吗?

Vas*_*sil 9 java validation spring spring-mvc

我不确定根据数据库状态使验证器验证命令是否是一个好的设计决策.例如,如果我需要验证User bean,除了检查电子邮件和用户名是否为空等.如果已经使用过,我还需要拒绝它们.这种逻辑应该放在验证器还是服务对象中?

ska*_*man 12

那么你的验证器只是spring bean,所以它们可以注入处理数据访问的服务对象.您可以让验证器从数据库中获取数据,而不会影响设计.

  • 嗯...仅仅因为你*可以*做某事并不一定意味着你*应该*做它。我可以在错误的地方注入很多讨厌的东西,这肯定会损害系统的设计。 (2认同)

Geo*_*rge 7

这在很大程度上取决于您如何定义验证.考虑一下:你正在买东西,然后输入你的信用卡号码.如果校验位不匹配,则验证失败.没有尝试过任何交易.但是,如果它是有效的信用卡号,但它与您的邮政编码(需要DB /第三方交互)不匹配,则表示付款错误.

现在考虑一下:您输入的是您的地址,并输入Mastiffica作为您所在的国家/地区.为什么系统甚至允许你输入它 - 他们应该只将接口限制为有效条目(输入后不需要DB).

或者您在银行支付屏幕的金额字段中输入"50".为什么它允许那里的字母 - 验证失败(不需要DB).但是你在金额字段中输入50,结果证明你的账户里没有50英镑.这是验证错误吗?或者这是一次失败的交易?

现在,请考虑您已通过所有基本条目验证(信用卡校验和,国家/地区,数字,邮政编码),并且交易失败,因为您的信用卡已过期.是验证错误还是失败的交易?

您可以将验证视为用户不会完全输入完整数据的基本保证,或者您可以将验证视为"我可以使用我给出的数据完成此事务".我个人赞成前者,但同样,这是定义的问题.

然后是第一线验证的一个方面作为安全措施 - 已经被您的顶级UI层接受的野生数据可能是安全风险(SQL注入,例如)