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

时间:2014-12-10 10:01:39

标签: java soap wsdl cxf jax-ws

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

@XmlElement(required = true)
protected String number;

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

<xs:element name="number" type="xs:string"/>

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

我也尝试将@SchemaValidation添加到我的WS类中,但没有效果。

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

3 个答案:

答案 0 :(得分:2)

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

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

    我认为你可以在Java请求bean(as described here)中添加一个JAXB回调之后的unmarshal(),并在其中执行你想要的所有验证(格式验证或其他)。

    例如:

    @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
           }
        }
    
    }
    

    CXF验证功能

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

    我希望在等待更好的答案时能帮到你。

答案 1 :(得分:2)

minOccurs的默认值为1.因此,您的值必须存在 nillable的默认值为false。所以,你的价值不能为空 您已在Web服务中激活架构验证:

@WebService
@SchemaValidation(enabled = true)
public class MyService {
//...
}

最后但并非最不重要的是,你有一个结果架构。

但是,JAXB参考实现不会对您进行任何验证。

您必须使用Java Xml Validation API

自行完成此操作

这是一个简单的模式验证示例

public class XmlSchemaValidation {

    public static void main(String[] args) throws Exception {
        Something myObject = new Something();
        validate(myObject);
    }
    public static void validate(Something myObject) throws Exception {

        Schema s = SchemaFactory
                   .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
                   .newSchema(new File("Something.xsd"));

        Validator validator = s.newValidator();
        //You can set an error handler
        //validator.setErrorHandler(errorHandler);
        validator.validate( new JAXBSource(JAXBContext.newInstance(Something.class), myObject));
    }

}

答案 2 :(得分:1)

使用jaxb2-maven-plugin之类的工具生成JAXB类。在将有效负载发送到WebService之前或在使用JSR 303规范将有效负载接收到系统之前验证。 Click Here查看JSR 303 Validator。

这将使您的系统更加健壮。