springboot整合webservice
Spring Boot整合WebService,整合说白了就是整合用Java把老掉牙的SOAP协议重新包装一下,让它能在新项目里跑起来。整合别被“整合”两个字吓到——真正干起活来,整合比你想的整合简单,但坑也不少。整合 我的整合一个客户,银行核心系统还是整合2008年的C#写的,接口全是整合SOAP。新项目想用Spring Boot,整合数据得从那边拿。整合你说用REST?整合那边根本不懂。所以只能让Spring Boot去调他们的整合WebService。就这么个场景,整合逼着你必须会整合。整合 先从服务端说起。Spring Boot整合WebService,官方推荐用Spring Web Services(Spring-WS)。依赖就一个, 接口定义这块,我习惯先写好XSD(XML Schema),然后用 写Endpoint的时候注意了,别用 客户端那边更简单。用 但有个坑我必须提一下——超时设置。Spring的 还有个大坑是WSDL里如果引用了外部Schema,启动时解析会报错。别慌,多半是防火墙挡了外部访问。把Schema文件下载到本地,改一下WSDL里的import路径,或者用 性能方面,SOAP天生比REST重,因为XML报文啰嗦。如果只是内部系统对接,数据量不大,无所谓。但要是高并发场景,建议在 最后说个调试技巧。开发阶段在 整合这事,说白了就是把传输协议、XML绑定、消息路由这三件事交给框架,你只管写业务逻辑。但框架替你省时间的地方,往往也是坑藏得最深的地方——超时、线程、Schema解析,每个都值得你多花十分钟看看源码。别问我怎么知道的,都是血泪。spring-boot-starter-web-services,加上一个wsdl4j用来解析WSDL文件。配置类里用@EnableWs注解,再注册一个ServletRegistrationBean把MessageDispatcherServlet挂上去。这个servlet是Spring-WS的核心,所有SOAP请求都走它。xjc命令生成Java类。你要是图省事,也可以直接手写Java类加@XmlRootElement注解。但说实话,XSD先行更靠谱,尤其是字段多的时候,手写容易漏掉命名空间。@Controller,那是REST用的。Spring-WS里用的是@Endpoint注解,方法上配@PayloadRoot指定命名空间和请求根元素。方法参数直接是请求对象,返回对象就是响应。框架自动帮你做XML和Java对象的转换,这块确实省心。WebServiceTemplate,配置好连接地址和消息转换器(一般用Jaxb2Marshaller),直接marshalSendAndReceive传个请求对象进去,返回的就是响应对象。类型安全,不用自己拼XML字符串,比裸写SOAPClient强一百倍。WebServiceTemplate默认用的是HttpUrlConnection,没设超时的话,对方服务挂了,你的线程能卡死半天。我那次调银行接口,对方下午四点批量跑批,五点前所有请求都超时。后来我换成Apache HttpClient作为底层连接器,设了连接超时3秒、读取超时10秒,世界清净了。具体做法是注入一个HttpComponentsMessageSender,里面配好HttpClient实例。Resource加载本地文件,都能解决。MessageDispatcherServlet上开线程池,别用默认的单线程模型。配置里加threadPoolSize和maxThreads就行。application.yml里加一条:logging.level.org.springframework.ws.client.MessageTracing=TRACE。这样控制台会打印完整的SOAP请求和响应报文。跟对方联调时,谁改了字段名、谁漏了参数,一眼就能看出来。我靠这个排查过不少问题,比看堆栈日志快多了。
-
上一篇
-
下一篇