1

是否有可能在 spring-ws 2 中获取未编组的有效负载以使用 jsr303 进行验证。这个想法是为我创建的每个端点完成此操作,而无需在每个端点中显式创建验证代码。(例如使用拦截器或某种监听器)

我尝试扩展 EndpointInterceptor 但是,这里没有未编组的对象。我还尝试为 jaxb 解组器实现 Unmarshaller.Listener。通过 spring 上下文注册了这个,但是这里有两个问题: 1. 它只在初始化 jaxb-marshaller bean 时设置 unmarshaller 侦听器。2. Jaxb Unmarshaller 在每个请求上创建,并且在为该特定请求创建 unmarshaller 期间未设置侦听器。我看不到在每个请求上都注入它的方法。

那么还有其他方法可以实现这一目标吗?

提前致谢。

4

2 回答 2

1

由于 Spring WS 端点是普通的 Spring Bean,您可以利用 Spring 的 AOP 功能并创建一个切面来验证传递的对象。

如果您使用 Spring 3.1 和 Hibernate Validator 4.2 作为 Bean Validation 提供者,您还可以使用 Hibernate Validator 的方法验证功能。Spring 提供了一个拦截器,它对使用@Validated注释的所有 bean 执行方法验证。

于 2012-11-20T20:08:34.747 回答
0

如果您不想使用 AOP,可以这样做:

  1. 您将需要扩展 DefaultMethodEndpointAdapter 并在子类中实现 Ordered(例如:

    DefaultMethodEndpointAdapterWithJSRValidation 扩展 DefaultMethodEndpointAdapter 实现 Ordered {...)

确保在子类中覆盖以下内容:

1.1 在此方法中,您将添加您的 jsr 验证内容:

@Override
public Object[] getMethodArguments ...

1.2 此方法确保使用您的 bean 而不是默认 bean。

@Override
public int getOrder() {
  return Integer.MIN_VALUE;
}
  1. 您可以像这样在spring上下文中注册您的bean:

<bean id="defaultMethodEndpointAdapter" class="your.package.DefaultMethodEndpointAdapterWithJSRValidation" primary="true"/>"

玩得开心。

于 2013-08-28T13:24:34.977 回答