我创建了一个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的请求验证(或者更确切地说是针对基于注释的约束的验证)?
答案 0 :(得分:2)
如果您无法解决问题,我建议您解决两个问题:
我认为你可以在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
}
}
}
另一种可能性是使用Bean验证和CXF(as documented here)。通常,它不是基于模式的验证所必需的,但如果您需要比基于模式的验证更复杂的验证,我认为它毕竟可以解决您的问题。
我希望在等待更好的答案时能帮到你。
答案 1 :(得分:2)
minOccurs的默认值为1.因此,您的值必须存在
nillable的默认值为false。所以,你的价值不能为空
您已在Web服务中激活架构验证:
@WebService
@SchemaValidation(enabled = true)
public class MyService {
//...
}
最后但并非最不重要的是,你有一个结果架构。
但是,JAXB参考实现不会对您进行任何验证。
自行完成此操作这是一个简单的模式验证示例
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。
这将使您的系统更加健壮。