Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将复杂的业务验证与JSR-303合并?_Java_Validation_Jpa_Ejb_Bean Validation - Fatal编程技术网

Java 如何将复杂的业务验证与JSR-303合并?

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

在我当前的用例中,我一直在进行验证。 我的应用程序具有标准结构(WEB EJB3服务EJB3 DAO DB)。 我有一个应用了验证注释的实体

@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中都可能进行一些隐含的更改。这也使得重构变得困难,如果逻辑如此分散,就很难监督用例。