Apache Axis 1.x 根据wsdl文件生成客户端代码 调用webservice接口

Apache Axis 1.x 是一个用于构建基于 SOAP(Simple Object Access Protocol)的 Web 服务的开源框架。它支持 JAX-RPC(Java API for XML-Based RPC)规范,用于在分布式环境中进行远程过程调用(RPC)。Axis 1.x 是一个较旧版本的 Apache Axis,它已经被 Apache Axis2 所取代。

一、如何根据 wsdl 获取 java 代码

本文不讨论自己写http代码去调用webservice服务的方式,一个是不推荐,二是本人真的感觉http调用webservice的方法不够优雅(主要是懒 - V -)。

1.1 IDEA的内置工具根据wsdl文件生成Java代码

第一种方式: IDEA中,根据 wsdl 文件 使用内置工具 Tools -> XML Webservices and WSDL -> Generate Java Code From WSDL获取客户端代码。 非常重要的一点: 要选中 wsdl文件上层文件夹后 点击 Tools

Apache Axis 1.x 根据wsdl文件生成客户端代码 调用webservice接口_第1张图片
然后,选择wsdl文件、选择输出路径、输出包路径、客户端等信息。

Apache Axis 1.x 根据wsdl文件生成客户端代码 调用webservice接口_第2张图片
当然了你可能会遇到如下问题:

  • 错误: 找不到或无法加载主类 org.apache.axis.wsdl.WSDL2Java
  • 缺少 各种依赖,导致报错。

Maven 依赖


 <dependency>
     <groupId>axisgroupId>
     <artifactId>axisartifactId>
     <version>1.4version>
 dependency>

1.2 直接使用 Apache Axis 1.X 生成Java代码

原理都是一样的,只不过一个是界面操作,一个是命令行操作。

第一步,下载Apache Axis 1.4 ,官方下载传送门

第二步,解压缩,进入lib 目录,目录清单参考
在这里插入图片描述
第三步,使用 WSDL2Java 根据 wsdl 文件生成 java客户端代码

java -cp axis.jar:commons-logging-1.0.4.jar:commons-discovery-0.2.jar:jaxrpc.jar:wsdl4j-1.5.1.jar org.apache.axis.wsdl.WSDL2Java  /your/path/xxx.wsdl -o  /your/target/path
  • 要指定你的wsdl文件所在的路径
  • 指定你的java客户端代码输出路径(可以不指定,那么就在当前目录)

第四步,运行后,你就会得到4个文件。
Apache Axis 1.x 根据wsdl文件生成客户端代码 调用webservice接口_第3张图片

  • Services 接口文件:这个接口定义了访问 Web 服务的方法。
  • ServiceLocator 接口:这个接口包含了获取服务实例的方法,用于创建与 Web 服务的连接。
  • SoapBindingStub 类:这个类是 SoapBindingStub 的子类,实现了 YourServiceName 接口。它提供了与 Web 服务进行通信的实际实现。

第五步,根据需要,就可以像本地服务一样调用了,例如 注入为一个 Bean

@Configuration
public class AppConfig {

    @Bean
    public UpdateAppAcctServices updateAppAcctServices() {
        UpdateAppAcctServicesImplService locator = new UpdateAppAcctServicesImplServiceLocator();
        UpdateAppAcctServices service = null;
        try {
            service = locator.getUpdateAppAcctServicesImplPort();
        } catch (ServiceException e) {
            throw new RuntimeException(e);
        }
        return service;
    }
}

二、 使用JAXB进行参数/返回结果处理,避免直接拼接处理字符串

Java Architecture for XML Binding(JAXB)是一个用于在 Java 对象和 XML 文档之间进行相互转换的技术。它允许开发人员将 Java 类映射到 XML Schema 或 XML 文档,以及将 XML 文档映射回 Java 类。JAXB 提供了一组注解和 API,使得 XML 数据的绑定(binding)变得更加容易。

要注意:在 Java 9+ 中,JAXB 被移出了标准库,作为单独的项目进行维护。

常用注解:

  • @XmlRootElement : 用于将一个类映射为 XML 文档的根元素。可以应用于类级别。
  • @XmlElement: 用于将一个字段或属性映射为 XML 元素。可以应用于字段或 getter 方法。可以通过 name 属性指定 XML 元素的名称。
  • @XmlAttribute : 用于将一个字段或属性映射为 XML 元素的属性。用于将一个字段或属性映射为 XML 元素的属性。可以通过 name 属性指定 XML 属性的名称。
  • @XmlElementWrapper :用于包装集合,并将其映射为一个包含元素的 XML 元素。可以应用于字段或 getter 方法。
  • @XmlTransient : 用于指示某个字段或属性在 XML 映射中应该被忽略。可以应用于字段或 getter 方法。
  • @XmlType : 用于在类级别指定 XML 类型信息,如命名空间和顺序。可以应用于类。

举个例子:

@XmlRootElement
@EqualsAndHashCode(callSuper = true)
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class LoginRequestXmlMessage {

    @XmlElement(name="HEAD")
    private XmlHead head;

    public LoginRequestXmlMessage() {
        super();
    }

    @XmlElement(name="BODY")
    private LoginBodyXmlElement body;

    public static LoginRequestXmlMessage toLoginRequestXmlMessage(FourALoginVO login4A) {
        LoginRequestXmlMessage requestXmlMessage = new LoginRequestXmlMessage();
        requestXmlMessage.setBody(new LoginBodyXmlElement(login4A.getAppAcctId(), login4A.getToken()));
        return requestXmlMessage;
    }
}

@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class XmlHead {

    @XmlElement(name="CODE")
    private String code;//消息标志

    @XmlElement(name="SID")
    private String sid;//消息序列号

    @XmlElement(name="TIMESTAMP")
    private String timestamp;//时间戳

    @XmlElement(name="SERVICEID")
    private String serviceId;//应用标识
    
}

工具类转换,例如:

@Slf4j
public class XmlUtil {

    /**
     * 将xml 字符串转化为 Java bean
     *
     * @param xml xml请求报文
     * @param clazz xml转换为对象的类型
     * @param 
     * @return
     */
    public static <T> T xmlToObject(String xml, Class<T> clazz) {
        try {
            JAXBContext jc = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = jc.createUnmarshaller();
            JAXBElement<T> je = unmarshaller.unmarshal(new StreamSource(new StringReader(xml)), clazz);
            return je.getValue();
        } catch (JAXBException e) {
            log.error("failed to convert xml string to object", e);
            return null;
        }
    }

    /**
     * 将webservice 对象转化为 xml 字符串
     *
     * @param t 对象泛型
     * @param clazz 对象class类
     * @param  泛型占位符
     * @return 返回字符串 如果为出现异常 返回null
     */
    public static <T> String objectToXml(T t, Class... clazz) {
        try {
            StringWriter stringOut = new StringWriter();
            stringOut.write("\n");
            JAXBContext jc = JAXBContext.newInstance(clazz);
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            marshaller.marshal(t, stringOut);
            return stringOut.toString();
        } catch (JAXBException e) {
            log.error("failed to convert object to xml string", e);
            return "";
        }
    }

    public static <T> String objectToXmlNoHeader(T t, Class... clazz) {
        try {
            StringWriter stringOut = new StringWriter();
            JAXBContext jc = JAXBContext.newInstance(clazz);
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            marshaller.marshal(t, stringOut);
            return stringOut.toString();
        } catch (JAXBException e) {
            log.error("failed to convert object to xml string", e);
            return "";
        }
    }
}

你可能感兴趣的:(Apache,apache)