我正在尝试将一个在 Spring Boot 2.7.5 中使用
org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean
的项目升级到 Spring Boot 3。这是我的 bean 的声明:
@Bean
public JaxWsPortProxyFactoryBean myJaxWsClient() {
JaxWsPortProxyFactoryBean jaxWsPortProxyFactoryBean = new JaxWsPortProxyFactoryBean();
jaxWsPortProxyFactoryBean.setJaxWsService(new My_Service());
jaxWsPortProxyFactoryBean.setWsdlDocumentUrl(Thread.currentThread().getContextClassLoader().getResource("META-INF/my.wsdl"));
jaxWsPortProxyFactoryBean.setNamespaceUri("urn:net:something");
jaxWsPortProxyFactoryBean.setServiceName("MyService");
jaxWsPortProxyFactoryBean.setServiceInterface(My.class);
jaxWsPortProxyFactoryBean.setEndpointAddress("http://someuri:7979/myservice");
jaxWsPortProxyFactoryBean.setUsername("username");
jaxWsPortProxyFactoryBean.setPassword("password");
return jaxWsPortProxyFactoryBean;
}
但是,
org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean
在Spring Boot 3中似乎不可用,或者已经转移到另一个库了。
我的问题是:如何在 Spring Boot 3 中使用
JaxWsPortProxyFactoryBean
,或者如何迁移到更现代的替代方案(如果可用)?
该类与许多其他类一样,已在 Spring Framework 6 中删除(Spring Boot 3 使用该类)。它已由此 Github 票证 和此 commit 记录。旧式远程处理支持(由于存在漏洞和可用的更好选项)已从核心库中删除。
对于 JAX-WS 部分,您可能希望在当今时代使用类似 Apache CXF 的东西,这将允许动态代理。另一种选择是使用 Spring Web Services
自己实现客户端JAXWS-RI 也是一个选项:您使用 jaxws-maven-plugin 生成 MyService 和 MyPort。然后使用 Spring 进行设置:
@Bean
public MyService myService() {
try {
URL wsdlLocation = this.getClass().getResource("/META-INF/wsdl/my.wsdl");
return new MyService(wsdlLocation); // may pass features here
} catch (Exception e) {
throw(new IllegalStateException(e);
}
}
在您的客户端实现中,假设您编写了一个 MyConfigProperties 类来访问 application.properties:
public MyClient(MyService myService, MyConfigProperties props) {
this.myPort = myService.getMyPort();
this.props = props;
}
public MyResult callEndpoint() {
BindingProvider bindingProvider = (BindingProvider) msgBoxPort;
Map<String, Object> requestContext = bindingProvider.getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, props.getWebserviceUri());
// requestContext.put(JAXWSProperties.SSL_SOCKET_FACTORY, sslSocketFactory);
return myPort.callEndpoint();
}