在JAX-WS代码优先方法中验证针对模式的soap请求

kga*_*ron 11 java soap wsdl cxf jax-ws

我创建了一个JAX-WS Web服务,在某些请求字段上使用JAXB注释使其成为必需的.

@XmlElement(required = true)
protected String number;
Run Code Online (Sandbox Code Playgroud)

由cxf-java2ws-plugin生成的WSDL是正确的,minOccurs="0"字段上没有:

<xs:element name="number" type="xs:string"/>
Run Code Online (Sandbox Code Playgroud)

但是当服务收到不遵守这些约束(缺少字段)的请求时,不会抛出SoapFault或异常.

我也试过添加@SchemaValidation到我的WS类,没有任何效果.

如何针对schmema进行请求验证(或者更确切地说,基于注释的约束验证)可以自动化?

Kev*_*Hol 2

如果您无法解决问题,我建议两种解决方法:

  1. JAXB 解组后验证您的 bean
  2. 使用 CXF 验证功能

JAXB 解组后的验证

我认为您可以在 Java 请求 bean 中添加一个 JAXB 回调 afterUnmarshal() (如此处所述),并在其中执行您想要的所有验证(格式验证或其他)。

例如 :

@XmlRootElement
public class YourRequest {

    @XmlElement(required = true)
    protected String number;

    // some code here

    public void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
       if(number == null) {
           // Throw validation exception
       }
    }

}
Run Code Online (Sandbox Code Playgroud)

CXF 验证功能

另一种可能性是将 Bean 验证与 CXF 结合使用(如此处所述)。通常,基于模式的验证不是必需的,但如果您需要比基于模式的验证更复杂的验证,我认为它毕竟可以解决您的问题。

希望对您在等待更好的答案时有所帮助。