我的假设是,每个Spring@Enpoint类需要不同的路径。我现在意识到我只需要注册一个
MessageDispatcherServlet
并定义处理传入请求所需的wsdl文件。
因为我需要两个不同的wsdl文件,所以我可以通过创建一个来支持这两个文件
ServletRegistrationBean
持有
MessageDispatcherServlet
二
Wsdl11Definition
bean(每个wsdl文件一个),并且在我的@Endpoint类中,我将名称空间和localPart设置为
@PayloadRoot
注释。
配置类
@EnableWs
@Configuration
public class SpringConfiguration
{
@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext)
{
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean(servlet, "/soap");
}
@Bean
AnnotationActionEndpointMapping annotationActionEndpointMapping()
{
AnnotationActionEndpointMapping mapping = new AnnotationActionEndpointMapping();
return mapping;
}
@Bean(name="wsdl-definition-A")
public Wsdl11Definition wsdl11DefinitionA()
{
SimpleWsdl11Definition def = new SimpleWsdl11Definition();
wsdl11Definition.setWsdl(new ClassPathResource("wsdl/A.wsdl"));
return wsdl11Definition;
}
@Bean(name="wsdl-definition-B")
public Wsdl11Definition wsdl11DefinitionA()
{
SimpleWsdl11Definition def = new SimpleWsdl11Definition();
wsdl11Definition.setWsdl(new ClassPathResource("wsdl/B.wsdl"));
return wsdl11Definition;
}
}
如果需要到端点的不同路径,而不是一条。我
假定
您需要调整
ServletRegistrationBean
上述定义。现在所有内容都映射到
"/soap"
。
以下是端点:
@Endpoint
public class AServer
{
private final static String NAMESPACE_URI = "http://some.namespace/v3/idk/am/i/even/real";
private final static String LOCALPART = "XMLElementName";
private final SomeMarshaller marshaller;
@Autowired
public EventServer(EventReceiveMarshaller marshaller)
{
this.marshaller = marshaller;
}
@Override
@ResponsePayload
@PayloadRoot(namespace = NAMESPACE_URI, localPart = LOCALPART)
public JAXBElement<SomeResponseMessageType> triggerResponse(@RequestPayload JAXBElement<SomeRequestMessageType> msg) {
return this.marshaller.createReply(msg);
}
}
然后
BServer
与
AServer
除了
NAMESPACE_URI
和
LOCALPART
因为它们依赖于各自的wsdl文件。