【问题标题】: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,可以这样做:

    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"/>"

    玩得开心。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-01-26
        • 1970-01-01
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        • 2015-05-01
        • 1970-01-01
        相关资源
        最近更新 更多