Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在SpringBoot框架中将jaxws:client注册为Springbean_Java_Spring_Spring Mvc_Spring Boot_Cxf - Fatal编程技术网

Java 在SpringBoot框架中将jaxws:client注册为Springbean

Java 在SpringBoot框架中将jaxws:client注册为Springbean,java,spring,spring-mvc,spring-boot,cxf,Java,Spring,Spring Mvc,Spring Boot,Cxf,我看到了一个java项目,其中使用WSDL2Java命令生成了一个webservice客户机。该项目还包含一个spring.xml,其配置如下: <jaxws:client id = "com.xyz.connector" serviceClass = "com.xyz.XYZServicePort" address = "<endpoint url from config>" bus="XYZServiceBus"> </jaxws

我看到了一个java项目,其中使用WSDL2Java命令生成了一个webservice客户机。该项目还包含一个spring.xml,其配置如下:

<jaxws:client
    id = "com.xyz.connector"
    serviceClass = "com.xyz.XYZServicePort"
    address = "<endpoint url from config>"
    bus="XYZServiceBus">
</jaxws:client>
<bean id = "XYZPasswordCallback" class = "com.xyz.ClientPasswordCallback">
    <property name = "password" value = "<password from config>"/>
</bean>
<bean id = "logInbound" class = "org.apache.cxf.interceptor.LoggingInInterceptor"/>
<bean id = "logOutbound" class = "org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<cxf:bus bus="XYZServiceBus">
    <cxf:inInterceptors>
        <ref bean = "logInbound"/>
    </cxf:inInterceptors>
    <cxf:outInterceptors>
        <ref bean = "logOutbound"/>
        <bean class = "org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
            <constructor-arg>
                <map>
                    <entry key = "action" value = "UsernameToken"/>
                    <entry key = "addUTElements" value = "Unique ID Created"/>
                    <entry key = "user" value = "<user id from config>"/>
                    <entry key = "passwordType" value = "PasswordText"/>
                    <entry key = "passwordCallbackRef" value-ref = "XYZServiceBus"/>
                </map>
            </constructor-arg>
        </bean>
    </cxf:outInterceptors>
    <cxf:outFaultInterceptors>
        <ref bean = "logOutbound"/>
    </cxf:outFaultInterceptors>
    <cxf:inFaultInterceptors>
        <ref bean = "logInbound"/>
    </cxf:inFaultInterceptors>
</cxf:bus>
XYZServicePort是使用类中的注释自动连接的。然后使用XYZServicePort调用服务公开的操作


与spring.xml相关的xml代码段是添加到使用wsdl2java命令生成的webservice客户端项目中的唯一配置文件。我在spring.xml中没有看到任何配置,也没有在将xyzerviceport定义为bean的代码中看到任何注释。spring.xml中的xml片段是否以某种方式将XYZServicePort转换为Springbean?

我不确定您遇到了什么问题-是关于@wsdl2java@client代码的问题不起作用了吗

回答你的问题:

Does the xml snippet present in spring.xml somehow converts the XYZServicePort to a spring bean?
CXF提供了关于如何与Spring集成的非常好的文档:


基本上,CXF在Spring初始化期间注册它自己的“工厂bean”——知道如何在Spring应用程序上下文中“生成”bean的类

因此,您可能正在寻找的是JaxWsClientFactoryBean

--编辑:解释如何调用这些工厂bean--
1.您有一个CXF客户端项目,它在类路径上包含CXF JAR
2.在类加载期间,JVM加载其中的所有JAR和SPI
3.CXF注册为“javax.xml.ws.spi.provider”(在CXF-rt-frontend-jaxws-3.1.1.jar中有一个文件/META-INF/services/javax.xml.ws.spi.provider,指向org.apache.CXF.jaxws.spi.ProviderImpl
4.当客户端代码实例化扩展javax.xml.ws.service的JAXWS服务时,javax.xml.ws.service的受保护构造函数会联系注册的SPI提供者(CXF提供者),魔术开始了:)

您应该在代码上设置断点,例如

TestService ss = new TestService(wsdlURL, SERVICE_NAME);
然后自己调试。

可以在客户端使用。您将为它提供一个bean名称、服务接口和服务URL,CXF将创建一个具有指定名称的bean,实现服务接口,调用远程SOAP服务,该服务需要在Spring中注入,而该客户端需要调用该服务

有关更多详细信息,请参考以下URL:


希望这会有帮助

如果我需要进一步探索或提供更多信息,请帮助让我知道。非常感谢您的回复!!列出的代码工作正常。客户端被导入,并按预期工作。但是,我无法理解xyzerviceport是如何转换为bean的,因为我没有看到任何显式配置。列出的代码/配置是代码中的全部内容,我看不到正在使用JaxWsClientFactoryBean。上面列出的配置是否将xyzerviceport转换为bean?我查看了您共享的文档,但仍然可以很好地了解我帖子中列出的代码/配置是如何导致XYZServicePort注册为Spring bean的。@PunterVicky我已经在我的回答中添加了关于CXF如何工作的解释。欢迎Vicky
TestService ss = new TestService(wsdlURL, SERVICE_NAME);