基于Spring 2.5构建的业务应用程序的验证框架
在基于Spring 2.5的中型企业级业务应用程序上编写验证层的最佳策略是什么?
我知道Spring提供了一些工具,我们可以在其中实现Validator接口并在validate方法中编写验证逻辑。但这将仅限于通过spring控制器发出的Web请求。
我想开发可在Web服务调用期间使用的验证框架。
换句话说,该框架可以保留下来并独立调用,而无需实现Validator接口,然后它也可以自动集成到Spring MVC流中。
希望你明白我的意思。
解决方案
回答
Spring验证框架可以在Spring MVC之外使用。我们正在使用什么WebServices Stack?如果我们使用的是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)
"对象目标"是表单对象,是表示要显示给用户的页面的整个对象。 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服务将基于对将在Web服务中使用的直接对象的getCommonValidator()。validate(partialObject)的调用。
第二种方法是这样的,尽管接口仅允许从给定对象返回Web服务验证对象的对象,而不是该对象本身就是可用的Web服务验证对象。