记快乐符号:
    利用 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 数据

    1. /**
    2. * xfireSendMsg -传递xml 请求数据 <br>
    3. * @version: 1.0 <br>
    4. * @since: 2021/12/28 2:45 下午 <br>
    5. * @author: 释槐~ <br>
    6. *
    7. * @param xfireUrl
    8. * @param namespaceURI
    9. * @param method
    10. * @param reqXml
    11. * @return java.lang.String
    12. */
    13. public static String xfireSendMsg(String xfireUrl, String namespaceURI, String method, String reqXml) throws Exception {
    14. /** 创建服务 **/
    15. Client client = new Client(new URL(xfireUrl));
    16. /** 设置调用的方法和方法的命名空间 **/
    17. client.setProperty(namespaceURI, method);
    18. /** 通过映射获得结果 **/
    19. Object[] result = new Object[0];
    20. try {
    21. result = client.invoke(method, new Object[]{reqXml});
    22. } catch (Exception e) {
    23. e.printStackTrace();
    24. throw e;
    25. }
    26. String xml = (String) result[0];
    27. log.info("响应报文 : {}", xml);
    28. return xml;
    29. }


    调用例子

    1. public static void main(String[] args) throws Exception {
    2. String xfireUrl = "请求地址?wsdl";
    3. String namespaceURI = "上述地址浏览器请求展示处理的命名空间地址";
    4. String method = "方法地址";
    5. obj obj = new obj();
    6. /** 对象转xml string 传递 **/
    7. String convertToXml = XMLUtil.convertToXml(obj);
    8. /** 调用服务 **/
    9. XFireClient.xfireSendMsg(xfireUrl, namespaceURI, method, convertToXml);
    10. }

    xml工具

    1. public class XMLUtil {
    2. public static String convertToXml(Object obj) {
    3. StringWriter sw = new StringWriter();
    4. try {
    5. JAXBContext context = JAXBContext.newInstance(obj.getClass());
    6. Marshaller marshaller = context.createMarshaller();
    7. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    8. marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
    9. marshaller.marshal(obj, sw);
    10. } catch (JAXBException e) {
    11. e.printStackTrace();
    12. }
    13. return sw.toString();
    14. }
    15. }

    类例子

    1. /**
    2. * @description: <br>
    3. * @since: 2021/12/20 5:37 下午 <br>
    4. * @author: 释槐~ <br>
    5. * @version: <br>
    6. */
    7. @XmlAccessorType(XmlAccessType.FIELD)
    8. /** XML文件中的根标识 **/
    9. @XmlRootElement(name = "X1")
    10. public class HisMessage implements Serializable {
    11. private static final long serialVersionUID = 1L;
    12. @XmlElement(name="X2")
    13. private obj x2;
    14. @XmlElement(name="x3")
    15. private obj x3;
    16. /** get与set **/
    17. }

    第二种就是方法调用式
    建立包目录结构一定要和 提供方一致!!!!!!!!!!!! 一定要一致 比如com.xxx.xxx 一定一致
    建立相同接口类

    1. /** 与wsdl 里面类名一致**/
    2. public interface X1{
    3. /** 与wsdl 里面方法一致**/
    4. public String X2(String strXml);
    5. }

    在启动类进行 bean加载;方便使用处获取

    1. @Bean("MyIService")
    2. public X1 getIService() throws MalformedURLException {
    3. log.error("加载接口代理工厂开始~~~~");
    4. Service service = new ObjectServiceFactory().create(X1.class);
    5. XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
    6. X1 iService = (X1) factory.create(service, "请求地址?wsdl");
    7. log.error("加载接口代理工厂开始~~~~");
    8. return iService;
    9. }

    这些可以在你想要的地方调用啦

    1. @Resource
    2. private X1 MyIService;/** 为什么叫这个名称你们懂噻 **/
    3. public void TestWebServices(){
    4. String str = MyIService.X2(convertToXml);
    5. System.out.println(str);
    6. }

    到这里就完了 ;返回参数转化成类 可以采用反射等;具体怎么深入改造加油