【问题标题】:spring-ws bean-validation of unmarshalled @RequestPayload未编组@RequestPayload的spring-ws bean验证
【发布时间】:2012-11-08 11:39:55
【问题描述】:
是否有可能在 spring-ws 2 中获取未编组的有效负载以使用 jsr303 进行验证。
这个想法是为我创建的每个端点完成此操作,而无需在每个端点中显式创建验证代码。 (例如使用拦截器或某种监听器)
我尝试扩展 EndpointInterceptor,但是这里没有未编组的对象。
我还尝试为 jaxb 解组器实现 Unmarshaller.Listener。通过 spring 上下文注册了这个,但这里有两个问题:
1. 它只在初始化 jaxb-marshaller bean 时设置 unmarshaller listener。
2. Jaxb Unmarshaller 在每个请求上创建,并且在为该特定请求创建 unmarshaller 期间未设置侦听器。我没有看到在每个请求上都注入它的方法。
那么还有其他方法可以实现吗?
提前致谢。
【问题讨论】:
标签:
jaxb
bean-validation
spring-ws
【解决方案1】:
如果您不想使用 AOP,可以这样做:
-
您需要扩展 DefaultMethodEndpointAdapter 并在子类中实现 Ordered(例如:
DefaultMethodEndpointAdapterWithJSRValidation 扩展 DefaultMethodEndpointAdapter 实现 Ordered {...)
确保在子类中覆盖以下内容:
1.1 在此方法中,您将添加您的 jsr 验证内容:
@Override
public Object[] getMethodArguments ...
1.2 此方法确保使用您的 bean 而不是默认 bean。
@Override
public int getOrder() {
return Integer.MIN_VALUE;
}
- 您可以像这样在 spring 上下文中注册您的 bean:
<bean id="defaultMethodEndpointAdapter" class="your.package.DefaultMethodEndpointAdapterWithJSRValidation" primary="true"/>"
玩得开心。
【解决方案2】:
由于 Spring WS 端点是普通的 Spring Bean,您可以利用 Spring 的 AOP 功能并创建一个切面来验证传递的对象。
如果您使用 Spring 3.1 和 Hibernate Validator 4.2 作为 Bean Validation 提供者,您还可以使用 Hibernate Validator 的 method validation 功能。 Spring 提供了一个interceptor,它对所有带有@Validated 注释的bean 执行方法验证。