记快乐符号:
利用 xfire 进行webservices 接口调用传递数据
目前探索到俩种方法
引入 pom.xml
<_dependency>
<_groupId_>org.codehaus.xfire
<_artifactId_>xfire-all
<_version_>1.2.6
<_exclusions_>
<_exclusion_>
<_groupId_>javax.activation
<_artifactId_>activation
<_exclusion_>
<_groupId_>org.springframework
<_artifactId_>spring
_
�
第一种需要定义调用的方法以及命名空间的方法
此处只传递一个参数 string 内容是一个xml 数据
/*** xfireSendMsg -传递xml 请求数据 <br>* @version: 1.0 <br>* @since: 2021/12/28 2:45 下午 <br>* @author: 释槐~ <br>** @param xfireUrl* @param namespaceURI* @param method* @param reqXml* @return java.lang.String*/public static String xfireSendMsg(String xfireUrl, String namespaceURI, String method, String reqXml) throws Exception {/** 创建服务 **/Client client = new Client(new URL(xfireUrl));/** 设置调用的方法和方法的命名空间 **/client.setProperty(namespaceURI, method);/** 通过映射获得结果 **/Object[] result = new Object[0];try {result = client.invoke(method, new Object[]{reqXml});} catch (Exception e) {e.printStackTrace();throw e;}String xml = (String) result[0];log.info("响应报文 : {}", xml);return xml;}
调用例子
public static void main(String[] args) throws Exception {String xfireUrl = "请求地址?wsdl";String namespaceURI = "上述地址浏览器请求展示处理的命名空间地址";String method = "方法地址";obj obj = new obj();/** 对象转xml string 传递 **/String convertToXml = XMLUtil.convertToXml(obj);/** 调用服务 **/XFireClient.xfireSendMsg(xfireUrl, namespaceURI, method, convertToXml);}
xml工具
public class XMLUtil {public static String convertToXml(Object obj) {StringWriter sw = new StringWriter();try {JAXBContext context = JAXBContext.newInstance(obj.getClass());Marshaller marshaller = context.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);marshaller.marshal(obj, sw);} catch (JAXBException e) {e.printStackTrace();}return sw.toString();}}
类例子
/*** @description: <br>* @since: 2021/12/20 5:37 下午 <br>* @author: 释槐~ <br>* @version: <br>*/@XmlAccessorType(XmlAccessType.FIELD)/** XML文件中的根标识 **/@XmlRootElement(name = "X1")public class HisMessage implements Serializable {private static final long serialVersionUID = 1L;@XmlElement(name="X2")private obj x2;@XmlElement(name="x3")private obj x3;/** get与set **/}
第二种就是方法调用式
建立包目录结构一定要和 提供方一致!!!!!!!!!!!! 一定要一致 比如com.xxx.xxx 一定一致
建立相同接口类
/** 与wsdl 里面类名一致**/public interface X1{/** 与wsdl 里面方法一致**/public String X2(String strXml);}
在启动类进行 bean加载;方便使用处获取
@Bean("MyIService")public X1 getIService() throws MalformedURLException {log.error("加载接口代理工厂开始~~~~");Service service = new ObjectServiceFactory().create(X1.class);XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());X1 iService = (X1) factory.create(service, "请求地址?wsdl");log.error("加载接口代理工厂开始~~~~");return iService;}
这些可以在你想要的地方调用啦
@Resourceprivate X1 MyIService;/** 为什么叫这个名称你们懂噻 **/public void TestWebServices(){String str = MyIService.X2(convertToXml);System.out.println(str);}
到这里就完了 ;返回参数转化成类 可以采用反射等;具体怎么深入改造加油
