spring-ws bean验证unmarshalled @RequestPayload

时间:2012-11-20 11:52:11

标签: jaxb bean-validation spring-ws

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

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

还有其他方法可以实现这个目标吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

如果您使用Spring 3.1和Hibernate Validator 4.2作为Bean Validation提供程序,您还可以使用Hibernate Validator的method validation功能。 Spring提供了interceptor,它对使用@Validated注释的所有bean执行方法验证。

答案 1 :(得分:0)

如果你不想使用AOP,这就是你要走的路:

  1. 您需要在子类中扩展DefaultMethodEndpointAdapter和implment Ordered(例如:

    DefaultMethodEndpointAdapterWithJSRValidation extends DefaultMethodEndpointAdapter实现Ordered {...)

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

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

    @Override
    public Object[] getMethodArguments ...
    

    1.2此方法确保使用您的bean代替默认bean。

    @Override
    public int getOrder() {
      return Integer.MIN_VALUE;
    }
    
    1. 您可以在弹簧上下文中注册bean,如下所示:
    2. <bean id="defaultMethodEndpointAdapter" class="your.package.DefaultMethodEndpointAdapterWithJSRValidation" primary="true"/>"

      玩得开心。