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 所取代。
本文不讨论自己写
http
代码去调用webservice服务的方式,一个是不推荐,二是本人真的感觉http
调用webservice的方法不够优雅(主要是懒 - V -)。
第一种方式: IDEA中,根据 wsdl 文件 使用内置工具 Tools -> XML Webservices and WSDL -> Generate Java Code From WSDL
获取客户端代码。 非常重要的一点: 要选中 wsdl
文件上层文件夹后 点击 Tools
。
然后,选择wsdl文件、选择输出路径、输出包路径、客户端等信息。
Maven 依赖
<dependency>
<groupId>axisgroupId>
<artifactId>axisartifactId>
<version>1.4version>
dependency>
原理都是一样的,只不过一个是界面操作,一个是命令行操作。
第一步,下载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
第五步,根据需要,就可以像本地服务一样调用了,例如 注入为一个 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;
}
}
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 "";
}
}
}