记快乐符号:
利用 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;
}
这些可以在你想要的地方调用啦
@Resource
private X1 MyIService;/** 为什么叫这个名称你们懂噻 **/
public void TestWebServices(){
String str = MyIService.X2(convertToXml);
System.out.println(str);
}
到这里就完了 ;返回参数转化成类 可以采用反射等;具体怎么深入改造加油