2016-05-12 54 views
1

我試圖公開使用SpringWS和Spring Boot的2個不同的靜態WSDL的2個不同的端點。公開多個靜態wsdl文件 - 春天WS

我遇到的問題是聲明兩個SimpleWsdl11Definition bean並且只公開一個。

這是我的配置文件:

@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訪問。有沒有人可以告訴我我錯過了什麼...

回答

1

下面的bean定義創建一個名爲MessageDispatcherServlet,帶有重寫的getWsdlDefinition方法。原始代碼中的此方法選擇wsdl,以便在彈出式WsdlDefinitions列表中顯示符合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」。