当前位置: 首页 > 知识库问答 >
问题:

具有一个命名空间的多个SOAPendpoint

王季萌
2023-03-14

我使用SpringBoot创建了一个SOAP Web服务服务器,并且我能够成功创建一个endpoint。但是,我无法创建多个endpoint并使用不同的URL访问它们。我想通过URL来访问处理该过程。

每个endpoint接收到的SOAP消息具有相同的模式。(命名空间和localpart是相同的!!!)我不想公开WSDL。

例如。

userA向以下URL发送以下SOAP消息:http://soap.example.com/ws/userA

<S:Envelope>
    <SOAP-ENV:Header>
    </SOAP-ENV:Header>
    <S:Body>
        <testsoap:post
            xmlns:testsoap="http://soap.example.com/">
            <testsoap:message>
                I am UserA
            </testsoap:message>
        </testsoap:post>
    </S:Body>
</S:Envelope>

用户b向URL发送以下SOAP消息:http://soap.example.com/ws/userB

<S:Envelope>
    <SOAP-ENV:Header>
    </SOAP-ENV:Header>
    <S:Body>
        <testsoap:post
            xmlns:testsoap="http://soap.example.com/">
            <testsoap:message>
                I am UserB
            </testsoap:message>
        </testsoap:post>
    </S:Body>
</S:Envelope>

代码如下。

@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {

    @Autowired
    CustomConfig customConfig;

    @Bean
    public ServletRegistrationBean<MessageDispatcherServlet> messageDispatherServlet(ApplicationContext applicationContext) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);
        return new ServletRegistrationBean<MessageDispatcherServlet>(servlet, "/ws/*");
    }
}

我想进入http://soap.example.com/ws/userA

@Endpoint
public class SoapRequestEndpoint {
    private static final String NAMESPACE_URI = "http://soap.example.com/";

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "post")
    @ResponsePayload
    public JAXBElement<PostResponse> postForA(MessageContext messageContext) {
        // do something for userA
    }
}

我想在 http://soap.example.com/ws/userB 访问

@Endpoint
public class SoapRequestEndpoint {
    private static final String NAMESPACE_URI = "http://soap.example.com/";

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "post")
    @ResponsePayload
    public JAXBElement<PostResponse> postForB(MessageContext messageContext) {
        // do something for userB
    }
}

谢了。

更新于2019年9月24日
从那以后我一直很努力,但我仍然不明白。我认为官方参考中没有写。你有什么想法吗?

更新于2019年10月3日<br>我还没有解决它。如果是这样的话,工作就会很困难。请帮助别人。

共有1个答案

申屠裕
2023-03-14

尝试在WebServiceConfig类中创建一个额外的Wsdl11定义方法,并使用@Bean(name="UserB")注释该方法。

您只显示了WebServiceConfig类中的一个片段,我假设该类中没有这个片段。

您的类应该如下所示:

@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {

    @Autowired
    CustomConfig customConfig;

    @Bean
    public ServletRegistrationBean<MessageDispatcherServlet> messageDispatherServlet(ApplicationContext applicationContext) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);
        return new ServletRegistrationBean<MessageDispatcherServlet>(servlet, "/ws/*");
    }
}

@Bean(name = "userA")
    public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema [randomMethodSchema]) {
        DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
        wsdl11Definition.setPortTypeName("userAPort");
        wsdl11Definition.setLocationUri("/ws");
        wsdl11Definition.setTargetNamespace("http://soap.example.com/");
        wsdl11Definition.setSchema([randomMethodSchema]);
        return wsdl11Definition;
    }

@Bean(name = "userB")
    public DefaultWsdl11Definition defaultWsdl11Definition2(XsdSchema [randomMethodSchema]) {
        DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
        wsdl11Definition.setPortTypeName("userBPort");
        wsdl11Definition.setLocationUri("/ws");
        wsdl11Definition.setTargetNamespace("http://soap.example.com/");
        wsdl11Definition.setSchema([randomMethodSchema]);
        return wsdl11Definition;
    }

    @Bean
    public XsdSchema [randomMethodSchema]() {
        return new SimpleXsdSchema(new ClassPathResource([schema name].xsd));
    }
}

HTH

 类似资料:
  • 我刚开始在xml中使用名称空间,所以我有点困惑,希望得到一些澄清。我有一个java服务,我正在接收具有许多不同名称空间的xml文档,当我开始工作时,我觉得我肯定做错了什么,所以我想检查一下。在我的包裹信息中。java我有我的模式注释,例如: 我有一辆火车.java在班级级别上注释如下: 并且类中的每个字段都注释为: 列车包含乘客列表,因此有一个属性 并且该集合被注释为: 然后在乘客体内。java类

  • 我发送一个POST请求,从一家运输公司生成AWB。为了做到这一点,我必须通过SOAP API POST请求发布多个数据条目。下面的XML是类似的,这是必需的(我已经简化了,否则它要求超过30个参数) 我是SOAP新手,请帮助我朝着正确的方向前进,我甚至非常感谢上面的XML代码,因为它有助于更好地理解。

  • 我有一个单节点K8s集群细分为几个命名空间,每个命名空间都有许多POD。来自一个命名空间的POD如何与不同命名空间中的另一个POD通信?我知道我可以有一个ClusterIP服务并向其公开部署,因此来自同一集群的其他POD可以通过该服务访问POD应用程序。来自不同命名空间的POD可以使用相同的ClusterIP服务来访问POD应用程序吗?另一个问题是,来自不同命名空间的POD是否可能共享相同的子网?

  • 我需要你在JAXB编组方面的帮助。这是关于命名空间的。我在这个令人惊叹的网站上阅读了不同的博客和很多答案,但我还没有意识到如何解决我的问题。 我需要用一些复杂的(至少对我来说)名称空间生成一个XML。 如您所见,该XML具有 < code > xmlns:xsi = " http://www . w3 . org/2001/XML schema-instance " 和 http://www.sa

  • 尝试使用camel cxf bean调用外部soap服务,但不确定如何在setHeader中传递多个名称空间。 OPERATION_NAMESPACE,常量("http://test.org/Imports") 对于其中一个操作,需要传递2个命名空间作为http://test.org/Importshttp://globe.org/schema 让我知道我们如何在调用cxf bean之前将骆驼头中

  • 我使用maven-jaxb2-plugin生成java文件从wsdl之一。运行“生成源”目标后,我得到以下错误 有几个wsdl文件,我需要不同的目标包,所以我尝试使用绑定文件,但现在只有1个wsdl。 这是我的插件配置 这是装订。xjb文件 开始服务。wsdl文件 看起来问题与具有相同targetNamespace的多个xs:schema元素有关,但我找不到如何在不修改wsdl的情况下修复它。