如何使用注释配置 PayloadValidatingInterceptor
How to configure PayloadValidatingInterceptor using annotation
我正在尝试开发 Spring 网络服务并按照本教程进行操作 https://spring.io/guides/gs/producing-web-service/
项目结构(和配置 class 名称)与教程中提到的相同。
我正在尝试使用注释进行所有可能的配置,并希望避免所有基于 xml 的配置。到目前为止,我什至通过使用 java 配置避免了 applicationContext.xml 和 web.xml。但是,现在我想介绍 XSD 验证,如本教程所示:
http://stack-over-flow.blogspot.com/2012/03/spring-ws-schema-validation-using.html 即通过扩展本教程中所示的 PayloadValidatingInterceptor class.As,然后需要使用以下 xml 配置注册此自定义验证器拦截器:
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
<property name="interceptors">
<list>
<ref bean="validatingInterceptor"/>
</list>
</property>
</bean>
<bean id="validatingInterceptor" class="com.test.ValidationInterceptor ">
<property name="schema" value="/jaxb/test.xsd"/>
</bean>
但是,我不知道如何使用注释进行上述配置。即将 XSD 文件设置为拦截器。我尝试覆盖 WsConfigurerAdaptor class 的 "addInterceptor" 来注册拦截器。请让我知道我是否需要这样做,或者使用注释完成整个事情的正确方法是什么。
我可以使用以下方法解决它:
@Override
public void addInterceptors(List<EndpointInterceptor> interceptors) {
interceptors.add(validationInterceptor());
}
@Bean
ValidationInterceptor validationInterceptor() {
final ValidationInterceptor payloadValidatingInterceptor = new ValidationInterceptor();
payloadValidatingInterceptor.setSchema(new ClassPathResource(
"XSD/Pay.xsd"));
return payloadValidatingInterceptor;
}
然后我不得不使用以下
从验证器class读取模式文件
SchemaFactory schemaFactory = SchemaFactory.newInstance(getSchemaLanguage());
Schema schema = schemaFactory.newSchema(getSchemas()[0].getURL());
Validator validator = schema.newValidator();
我正在使用 spring-boot,我正在寻找一种方法来做同样的事情,我发现了这个:
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Override
public void addInterceptors(List<EndpointInterceptor> interceptors) {
PayloadValidatingInterceptor validatingInterceptor = new PayloadValidatingInterceptor();
validatingInterceptor.setValidateRequest(true);
validatingInterceptor.setValidateResponse(true);
validatingInterceptor.setXsdSchema(resourceSchema());
interceptors.add(validatingInterceptor);
}
@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean(servlet, "/api/*");
}
@Bean(name = "registros")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema countriesSchema) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("ResourcePort");
wsdl11Definition.setLocationUri("/api");
wsdl11Definition.setTargetNamespace("http://resource.com/schema");
wsdl11Definition.setSchema(resourceSchema());
return wsdl11Definition;
}
@Bean
public XsdSchema resourceSchema() {
return new SimpleXsdSchema(new ClassPathResource("registro.xsd"));
}
}
在这个例子中,addInterceptors 方法很重要,其他 3 个是公开 WSDL 的基本方法 API。
也许对其他人有用。
我是按照下面的方法解决的
@Override
public void addInterceptors(List<EndpointInterceptor> interceptors) {
HotelDirectUpdateRQValidator validatingInterceptor = new HotelDirectUpdateRQValidator();
validatingInterceptor.setValidateRequest(true);
validatingInterceptor.setValidateResponse(false);
validatingInterceptor.setXsdSchemaCollection(new XsdSchemaCollection() {
@Override
public XsdSchema[] getXsdSchemas() {
return null;
}
@Override
public XmlValidator createValidator() {
try {
return XmlValidatorFactory.createValidator(getSchemas(), "http://www.w3.org/2001/XMLSchema");
} catch (Exception e) {
LOGGER.error("Failed to create validator e={}", e);
}
return null;
}
public Resource[] getSchemas() {
return new Resource[]{
new ClassPathResource("/schemas/OTA/OTA_HotelRateAmountNotifAndHotelAvailNotifRQValidate.xsd"),
new ClassPathResource("/schemas/HotelDirectUpdateRQ.xsd")
};
}
});
interceptors.add(validatingInterceptor);
}
在 spring.xml 中配置验证器拦截器 class,如下所示:
<sws:interceptors>
<bean id="validatingInterceptor"
class="com.kalra.xsd.validator.WSDLValidator">
<property name="xsdSchema" ref="types" />
<property name="validateRequest" value="true" />
<property name="validateResponse" value="true" />
</bean>
</sws:interceptors>
需要在此标记中添加您的 bean validatingInterceptor sws:interceptors 以便拦截器自动注册。对于sws前缀需要加上xmlns是"xmlns:sws="http://www.springframework.org/schema/web-services" in spring.xml
我们应该为我们自己的 QNAME 编写 PayloadValidatingInterceptor 的 wsdlvalidator child class 以在故障异常后显示在响应中,否则它将选择 sprint ws 的默认 qname。
WSDLValidator 代码快照:
import javax.xml.namespace.QName;
import org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor;
public class WSDLValidator extends PayloadValidatingInterceptor {
public WSDLValidator(){
}
@Override
public QName getDetailElementName() {
return new QName(Constants.XMLNamespaces.TNS_URI, "SoapValidationFault");
}
}
SoapValidationFault 是 XSD 中的复杂类型声明,TNS_URI 是 wsdl 中定义的目标命名空间,xsd.
我正在尝试开发 Spring 网络服务并按照本教程进行操作 https://spring.io/guides/gs/producing-web-service/
项目结构(和配置 class 名称)与教程中提到的相同。 我正在尝试使用注释进行所有可能的配置,并希望避免所有基于 xml 的配置。到目前为止,我什至通过使用 java 配置避免了 applicationContext.xml 和 web.xml。但是,现在我想介绍 XSD 验证,如本教程所示: http://stack-over-flow.blogspot.com/2012/03/spring-ws-schema-validation-using.html 即通过扩展本教程中所示的 PayloadValidatingInterceptor class.As,然后需要使用以下 xml 配置注册此自定义验证器拦截器:
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
<property name="interceptors">
<list>
<ref bean="validatingInterceptor"/>
</list>
</property>
</bean>
<bean id="validatingInterceptor" class="com.test.ValidationInterceptor ">
<property name="schema" value="/jaxb/test.xsd"/>
</bean>
但是,我不知道如何使用注释进行上述配置。即将 XSD 文件设置为拦截器。我尝试覆盖 WsConfigurerAdaptor class 的 "addInterceptor" 来注册拦截器。请让我知道我是否需要这样做,或者使用注释完成整个事情的正确方法是什么。
我可以使用以下方法解决它:
@Override
public void addInterceptors(List<EndpointInterceptor> interceptors) {
interceptors.add(validationInterceptor());
}
@Bean
ValidationInterceptor validationInterceptor() {
final ValidationInterceptor payloadValidatingInterceptor = new ValidationInterceptor();
payloadValidatingInterceptor.setSchema(new ClassPathResource(
"XSD/Pay.xsd"));
return payloadValidatingInterceptor;
}
然后我不得不使用以下
从验证器class读取模式文件SchemaFactory schemaFactory = SchemaFactory.newInstance(getSchemaLanguage());
Schema schema = schemaFactory.newSchema(getSchemas()[0].getURL());
Validator validator = schema.newValidator();
我正在使用 spring-boot,我正在寻找一种方法来做同样的事情,我发现了这个:
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Override
public void addInterceptors(List<EndpointInterceptor> interceptors) {
PayloadValidatingInterceptor validatingInterceptor = new PayloadValidatingInterceptor();
validatingInterceptor.setValidateRequest(true);
validatingInterceptor.setValidateResponse(true);
validatingInterceptor.setXsdSchema(resourceSchema());
interceptors.add(validatingInterceptor);
}
@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean(servlet, "/api/*");
}
@Bean(name = "registros")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema countriesSchema) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("ResourcePort");
wsdl11Definition.setLocationUri("/api");
wsdl11Definition.setTargetNamespace("http://resource.com/schema");
wsdl11Definition.setSchema(resourceSchema());
return wsdl11Definition;
}
@Bean
public XsdSchema resourceSchema() {
return new SimpleXsdSchema(new ClassPathResource("registro.xsd"));
}
}
在这个例子中,addInterceptors 方法很重要,其他 3 个是公开 WSDL 的基本方法 API。
也许对其他人有用。
我是按照下面的方法解决的
@Override
public void addInterceptors(List<EndpointInterceptor> interceptors) {
HotelDirectUpdateRQValidator validatingInterceptor = new HotelDirectUpdateRQValidator();
validatingInterceptor.setValidateRequest(true);
validatingInterceptor.setValidateResponse(false);
validatingInterceptor.setXsdSchemaCollection(new XsdSchemaCollection() {
@Override
public XsdSchema[] getXsdSchemas() {
return null;
}
@Override
public XmlValidator createValidator() {
try {
return XmlValidatorFactory.createValidator(getSchemas(), "http://www.w3.org/2001/XMLSchema");
} catch (Exception e) {
LOGGER.error("Failed to create validator e={}", e);
}
return null;
}
public Resource[] getSchemas() {
return new Resource[]{
new ClassPathResource("/schemas/OTA/OTA_HotelRateAmountNotifAndHotelAvailNotifRQValidate.xsd"),
new ClassPathResource("/schemas/HotelDirectUpdateRQ.xsd")
};
}
});
interceptors.add(validatingInterceptor);
}
在 spring.xml 中配置验证器拦截器 class,如下所示:
<sws:interceptors>
<bean id="validatingInterceptor"
class="com.kalra.xsd.validator.WSDLValidator">
<property name="xsdSchema" ref="types" />
<property name="validateRequest" value="true" />
<property name="validateResponse" value="true" />
</bean>
</sws:interceptors>
需要在此标记中添加您的 bean validatingInterceptor sws:interceptors 以便拦截器自动注册。对于sws前缀需要加上xmlns是"xmlns:sws="http://www.springframework.org/schema/web-services" in spring.xml
我们应该为我们自己的 QNAME 编写 PayloadValidatingInterceptor 的 wsdlvalidator child class 以在故障异常后显示在响应中,否则它将选择 sprint ws 的默认 qname。
WSDLValidator 代码快照:
import javax.xml.namespace.QName;
import org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor;
public class WSDLValidator extends PayloadValidatingInterceptor {
public WSDLValidator(){
}
@Override
public QName getDetailElementName() {
return new QName(Constants.XMLNamespaces.TNS_URI, "SoapValidationFault");
}
}
SoapValidationFault 是 XSD 中的复杂类型声明,TNS_URI 是 wsdl 中定义的目标命名空间,xsd.