Java 如何将复杂的业务验证与JSR-303合并?
在我当前的用例中,我一直在进行验证。 我的应用程序具有标准结构(WEB EJB3服务EJB3 DAO DB)。 我有一个应用了验证注释的实体Java 如何将复杂的业务验证与JSR-303合并?,java,validation,jpa,ejb,bean-validation,Java,Validation,Jpa,Ejb,Bean Validation,在我当前的用例中,我一直在进行验证。 我的应用程序具有标准结构(WEB EJB3服务EJB3 DAO DB)。 我有一个应用了验证注释的实体 @Entity class PhoneNumber { ... private NumberType numberType; } 在哪里 enum NumberType { FIXED, MOBILE, ANY } 现在我有了新的验证规则要应用。在PhoneNumber update上,如果以前将Number
@Entity
class PhoneNumber {
...
private NumberType numberType;
}
在哪里
enum NumberType {
FIXED,
MOBILE,
ANY
}
现在我有了新的验证规则要应用。在PhoneNumber update上,如果以前将NumberType设置为FIXED或MOBILE,则不可能将其更改为ANY
我的Bean验证规则是在db操作之前检查的,上面的规则应该应用于服务层(至少我认为是这样),以便有一个db访问权限来获取以前的实体版本进行比较。
但是如果没有bean还没有被验证,我不得不手动检查numberType是否为null
在使用Bean验证时,您能给我提供一些建议或一般规则来处理更复杂的业务验证(不仅仅是单独检查单个字段的值)吗?您可以找到一个很好的描述,说明如何编写一个自定义验证程序,它可以执行“跨字段”操作验证。您可以找到一个很好的描述,说明如何编写一个可以进行“跨域”验证的自定义验证程序。我认为Bean验证不是实现这种业务逻辑的正确解决方案
相反,您可以在
PhoneNumber
实体的setNumberType()
方法中实现此检查。您手头有旧的值,与服务层中的实现相比,没有机会通过绕过(意外或故意)实现检查的服务来执行非法状态转换。我认为Bean验证不是实现此类业务逻辑的正确解决方案
相反,您可以在
PhoneNumber
实体的setNumberType()
方法中实现此检查。您手头有旧值,与服务层中的实现相比,通过绕过(意外或故意)实现检查的服务,不可能执行非法状态转换。谢谢,但这不适合我的问题。我不需要跨域验证。我需要根据一个字段的前一个值(存储在DB中)对其进行验证。因此,您必须在自定义验证器中从数据库中查询实体,并根据其值进行检查。但我认为这不是一个好的做法。相反,我将在业务逻辑中加载旧实体,并在此处检查其值。这样,您就不会在验证器中隐藏此逻辑。谢谢,但这不适合我的问题。我不需要跨域验证。我需要根据一个字段的前一个值(存储在DB中)对其进行验证。因此,您必须在自定义验证器中从数据库中查询实体,并根据其值进行检查。但我认为这不是一个好的做法。相反,我将在业务逻辑中加载旧实体,并在此处检查其值。这样你就不会在验证器中隐藏这个逻辑。我同意你的第一段。但我不会把支票存入实体。在我看来,实体类只是愚蠢的POJO,不应该包含业务逻辑。否则,您无法推进业务逻辑,因为在任何setter中都可能进行一些隐含的更改。这也使得重构变得困难,如果逻辑如此分散,很难监督用例。我同意你的第一段。但我不会把支票存入实体。在我看来,实体类只是愚蠢的POJO,不应该包含业务逻辑。否则,您无法推进业务逻辑,因为在任何setter中都可能进行一些隐含的更改。这也使得重构变得困难,如果逻辑如此分散,就很难监督用例。