我想将Spring应用程序迁移到Spring Boot。原始应用程序由几个maven模块组成,我想重用一个现有模块。我想重用的模块是生成的cxf Web服务客户端。它在应用程序pom.xml
中链接如下:
<dependency>
<groupId>generated.package</groupId>
<artifactId>cxf-service-adapter</artifactId>
<version>1.0</version>
</dependency>
该模块中生成的GenCxfService
接口如下所示
@WebService(targetNamespace = "https://the-domain/the-service/", name = "genCxfService")
@XmlSeeAlso({ObjectFactory.class})
public interface GenCxfService {
// the anotated web service methods
// ....
}
我需要通过Spring Boot管理Web服务客户端接口GenCxfService
,以便我可以将其传递给spring security AuthenticationProvider
。
嗯,我认为这不是什么大问题。我从模块中获取了编译的cxf-service-adapter-1.0.jar
,将其放入一个自己的项目内存储库,并尝试将java配置设置为@autowire
bean。首先,我试着这样做:
import generated.package.GenCxfService;
...
@ComponentScan({"generated.package.*","my.package.*"})
...
@Bean
public MyAuthenticationProvider myAuthenticationProvider() {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setAddress("https://the-domain/the-service/");
factory.setServiceClass(GenCxfService.class);
GenCxfService genCxfService = (GenCxfService) factory.create();
return new my.package.authentication.MyAuthenticationProvider(userDAO, genCxfService);
}
这在运行时给出了以下异常:
javax.xml.ws.soap.SOAPFaultException: Could not find conduit initiator for address: https://the-domain/the-service/the-wsdl.asmx and transport: http://schemas.xmlsoap.org/soap/http
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:161)
at com.sun.proxy.$Proxy126.validateMyUser(Unknown Source)
at my.package.authentication.MyAuthenticationProvider.authenticate(MyAuthenticationProvider.java:47)
我以为我只是有一个错误的java配置,并尝试通过重用原始项目模块中的现有xml配置来使用
进行解决方法@ImportResource({"classpath:web-service.xml"})
使用xml文件:
<jaxws:client id="genCxfService"
serviceClass="generated.package.GenCxfService"
address="https://the-domain/the-service/the-wsdl.asmx">
</jaxws:client>
<bean id="logInbound" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<cxf:bus>
<cxf:inInterceptors>
<ref bean="logInbound" />
</cxf:inInterceptors>
<cxf:inFaultInterceptors>
<ref bean="logInbound" />
</cxf:inFaultInterceptors>
</cxf:bus>
这是cxf documentation (Configuring a Spring Client Option 1)中客户端的配置方式。不过,我仍然得到同样的错误。
我做错了什么?
将 cxf-rt-transports-http 添加到pom中可以解决问题:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
</dependency>
有人可以解释为什么缺少库在启动期间但在运行期间不会抛出异常吗?
提前致谢。
答案 0 :(得分:1)
Spring引导将在运行时找到类,因此您不必依赖于特定的库,它将使用反射来查找满足所需接口的类,以便轻松交换实现。
这些类也是懒惰地启动或查找的,这就是为什么它只在请求被发送而不是在它开始时发生。