我正在尝试使用SpringWS和Spring Boot公开2个不同的端点,用于2个不同的静态WSDL。
我遇到的问题是声明了两个SimpleWsdl11Definition beans,但只公开了一个。
以下是我的配置文件:
@EnableWs
@Configuration
public class AWSConfig extends WsConfigurerAdapter
{
@Bean
public ServletRegistrationBean aMessageDispatcherServlet(ApplicationContext applicationContext)
{
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean(servlet, "Av1/*");
}
@Bean(name = "AV1")
public SimpleWsdl11Definition simpleWsdl11Definition()
{
SimpleWsdl11Definition simpleWsdl11Definition = new SimpleWsdl11Definition();
simpleWsdl11Definition.setWsdl(new ClassPathResource("wsdl/AV1.wsdl"));
return simpleWsdl11Definition;
}
@Bean(name = "ASchema")
public XsdSchema aSchema()
{
return new SimpleXsdSchema(new ClassPathResource("xsd/A.xsd"));
}
}和
@EnableWs
@Configuration
public class BWSConfig
{
@Bean
public ServletRegistrationBean bMessageDispatcherServlet(ApplicationContext applicationContext)
{
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean(servlet, "Bv1/*");
}
@Bean(name = "BV1")
public SimpleWsdl11Definition simpleWsdl11Definition()
{
SimpleWsdl11Definition simpleWsdl11Definition = new SimpleWsdl11Definition();
simpleWsdl11Definition.setWsdl(wsdl/BV1.wsdl"));
return simpleWsdl11Definition;
}
@Bean(name = "bSchema")
public XsdSchema bSchema()
{
return new SimpleXsdSchema(new ClassPathResource("xsd/BV1.xsd"));
}
}只有AV1.wsdl是可访问的。有人能告诉我我错过了什么吗..。
发布于 2017-12-10 19:40:02
下面的bean定义创建了一个带有被覆盖的getWsdlDefinition方法的命名MessageDispatcherServlet。如果满足url条件,原始代码中的此方法将从spring发起的WsdlDefinitions列表中选择要公开的wsdl。下面的覆盖使得选择正确的解决方案成为可能,而不是spring模糊的解决方案。手动将url与wsdl定义配对。
@Bean(name = "servlet-a")
public ServletRegistrationBean messageDispatcherServletA(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
public ServletRegistrationBean messageDispatcherServletA(
ApplicationContext applicationContext,
@Qualifier("A") final Wsdl11Definition a) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet(){
private static final long serialVersionUID = 8547901522243924975L;
@Override
protected WsdlDefinition getWsdlDefinition(HttpServletRequest request) {
if (yourMethodCheckingForRightExposeUrl(request)) {
return a;
}
else {
return null;
}
}
};
servlet.setApplicationContext(applicationContext);
servlet.setMessageReceiverBeanName("yourSpecificReceiverBeanName");
ServletRegistrationBean bean = new ServletRegistrationBean(servlet, "/ws/your-endpoint/*"); // star needed to allow any urls
bean.setName("servlet-a");
return bean;
}
}在您的示例中,WsdlDefininition参数可以具有限定名称'BV1‘。
https://stackoverflow.com/questions/37198636
复制相似问题