Java 使用复杂业务逻辑和远程服务调用进行Bean验证

Java 使用复杂业务逻辑和远程服务调用进行Bean验证,java,bean-validation,Java,Bean Validation,我正在为一个web应用程序实现一个输入验证,它相当复杂,需要输入一个ID,并将调用其他几个系统,以便在持久化包含此ID的对象之前检查此ID是否有效。 我曾想过使用bean验证,但后来我发现自己创建了一个bean,专门用于允许进行此验证。事实上,为了进行远程服务调用,我不仅需要向验证器提供ID,还需要提供一些上下文信息 您是否认为bean验证始终是进行验证的正确位置,即使它很复杂并且需要bean范围之外的上下文进行验证 实现业务逻辑验证规则的Spring服务是更好的选择吗 或者其他验证器(Hibe

我正在为一个web应用程序实现一个输入验证,它相当复杂,需要输入一个ID,并将调用其他几个系统,以便在持久化包含此ID的对象之前检查此ID是否有效。 我曾想过使用bean验证,但后来我发现自己创建了一个bean,专门用于允许进行此验证。事实上,为了进行远程服务调用,我不仅需要向验证器提供ID,还需要提供一些上下文信息

您是否认为bean验证始终是进行验证的正确位置,即使它很复杂并且需要bean范围之外的上下文进行验证

实现业务逻辑验证规则的Spring服务是更好的选择吗

或者其他验证器(Hibernate、Spring)可以更好地处理我的用例


使用Bean验证进行复杂验证的最佳实践是什么?

Bean验证最适用于检查来自web表单的用户输入是否正确

若必须在其他系统中验证用户输入,则应将其作为算法中的常规步骤来实现

更新 Bean验证被发明用来代替琐碎乏味的手工验证,比如
if x!=null&&x<0然后是doReject()
,带有优雅的简短注释,如
@Min(1)

如果您的id验证不是微不足道的,那么我建议在您的算法中将其实现为清晰可见的操作。与在自定义bean验证中隐藏细节相比,它更易于实现和维护


然而,如果您的验证在您的应用程序中很常见,比如不同答案中描述的法语zip验证,那么最好实现自定义bean验证并在许多地方重用它。

bean验证最适用于检查来自web表单的用户输入是否正确

若必须在其他系统中验证用户输入,则应将其作为算法中的常规步骤来实现

更新 Bean验证被发明用来代替琐碎乏味的手工验证,比如
if x!=null&&x<0然后是doReject()
,带有优雅的简短注释,如
@Min(1)

如果您的id验证不是微不足道的,那么我建议在您的算法中将其实现为清晰可见的操作。与在自定义bean验证中隐藏细节相比,它更易于实现和维护


然而,如果您的验证在您的应用程序中很常见,比如不同答案中描述的法语zip验证,那么最好实现自定义bean验证并在许多地方重用它。

bean验证最适用于检查来自web表单的用户输入是否正确

若必须在其他系统中验证用户输入,则应将其作为算法中的常规步骤来实现

更新 Bean验证被发明用来代替琐碎乏味的手工验证,比如
if x!=null&&x<0然后是doReject()
,带有优雅的简短注释,如
@Min(1)

如果您的id验证不是微不足道的,那么我建议在您的算法中将其实现为清晰可见的操作。与在自定义bean验证中隐藏细节相比,它更易于实现和维护


然而,如果您的验证在您的应用程序中很常见,比如不同答案中描述的法语zip验证,那么最好实现自定义bean验证并在许多地方重用它。

bean验证最适用于检查来自web表单的用户输入是否正确

若必须在其他系统中验证用户输入,则应将其作为算法中的常规步骤来实现

更新 Bean验证被发明用来代替琐碎乏味的手工验证,比如
if x!=null&&x<0然后是doReject()
,带有优雅的简短注释,如
@Min(1)

如果您的id验证不是微不足道的,那么我建议在您的算法中将其实现为清晰可见的操作。与在自定义bean验证中隐藏细节相比,它更易于实现和维护


但是,如果您的验证在应用程序中很常见,比如不同答案中描述的法语zip验证,那么最好实现自定义bean验证并在许多地方重用它。

答案是肯定的。您可以开发CDI服务Bean(例如@ApplicationScoped)并将此CDI Bean注入ConstraintValidator类

您可以在Java bean验证规范页面中看到一个示例:

类ZipCodeValidator实现ConstraintValidator{ @注入 私人拉链服务; public void initialize(ZipCode ZipCode){} 公共布尔值有效(字符串值,ConstraintValidationContext){ if(value==null)返回true; 返回服务.isZipCodeValid(值); } }
答案是肯定的。您可以开发CDI服务Bean(例如@ApplicationScoped)并将此CDI Bean注入ConstraintValidator类

您可以在Java bean验证规范页面中看到一个示例:

类ZipCodeValidator实现ConstraintValidator{ @注入 私人拉链服务; public void initialize(ZipCode ZipCode){} 公共布尔值有效(字符串值,ConstraintValidationContext){ if(value==null)返回true; 返回服务.isZipCodeValid(值); } }
答案是肯定的。您可以开发CDI服务Bean(例如@ApplicationScoped)并将此CDI Bean注入ConstraintValidator类

您可以在Java bean验证规范页面中看到一个示例:

类ZipCodeValidator实现ConstraintValidator{ @注入 私人拉链服务; public void initialize(ZipCode ZipCode){} 公共布尔值有效(字符串值,ConstraintValidationContext){ if(value==null)返回true; 返回服务.isZipCodeValid(值); } }
答案是肯定的。您可以开发CDI服务Bean(例如@ApplicationScoped)a
class ZipCodeValidator implements ConstraintValidator<ZipCode, String> {

@Inject
private ZipService service;

public void initialize(ZipCode zipCode) {}

public boolean isValid(String value, ConstraintValidationContext context) {
    if (value==null) return true;
    return service.isZipCodeValid(value);
}
}