为基于 Spring 2.5 的中型企业级业务应用程序编写验证层的最佳策略是什么?
我知道 Spring 提供了工具,我们可以在其中实现 Validator 接口并在 validate 方法中编写验证逻辑。但这将仅限于通过 spring 控制器传入的 web 请求。
我想开发可以在 Web 服务调用期间使用的验证框架。
换句话说,框架可以保留和独立调用,而不需要实现 Validator 接口,然后它也可以自动集成到 Spring MVC 流中。
希望你明白我的意思。
为基于 Spring 2.5 的中型企业级业务应用程序编写验证层的最佳策略是什么?
我知道 Spring 提供了工具,我们可以在其中实现 Validator 接口并在 validate 方法中编写验证逻辑。但这将仅限于通过 spring 控制器传入的 web 请求。
我想开发可以在 Web 服务调用期间使用的验证框架。
换句话说,框架可以保留和独立调用,而不需要实现 Validator 接口,然后它也可以自动集成到 Spring MVC 流中。
希望你明白我的意思。
Spring Validation 框架可以在 Spring MVC 之外使用。您使用的是什么 WebServices 堆栈?如果您使用的是 Spring-WS(Spring 的 Web 服务堆栈),他们有关于如何在此处设置验证器的特殊说明:
http://static.springframework.org/spring-ws/sites/1.5/reference/html/server.html#d0e2313
如果您正在使用其他堆栈,则为该堆栈(或找到一个)实现将使用 Spring 验证框架的某些东西可能更容易。
回想一下 Validator 接口定义了两个方法:
boolean supports(Class clazz)
void validate(Object target, Errors errors)
这Object target
是您的表单对象,它是代表要向用户显示的页面的整个对象。Errors 实例将包含将显示给用户的错误。
因此,您需要做的是定义一个中介,该中介可以使用您想要验证的表单中的细节调用,这些细节也与您的 Web 服务中的相同。中介可以采取以下两种形式之一:
(可能是最好的):
public interface ErrorReturning {
public void getErrors(Errors errors);
}
(如果添加了两个以上的状态,这会变得非常难看):
public interface ValidationObject {
public Errors getErrors(Errors errors);
public Object getResultOfWebServiceValidation();
}
我建议实施第一种方法。使用您的通用验证,传递一个可直接用于 Web 服务验证的对象,但允许它实现该getErrors()
方法。这样,在您的 Spring 验证器中,在您的验证方法中,您可以简单地调用:
getCommonValidator().validate(partialObject).getErrors(errors);
您的 Web 服务将基于getCommonValidator().validate(partialObject)
对要在 Web 服务中使用的直接对象的调用。
第二种方法是这样的,尽管该接口只允许从给定对象返回一个对象以用于 Web 服务验证对象,而不是该对象本身就是一个可用的 Web 服务验证对象。