转 OFBIZ webservice简介

news/2024/6/18 22:21:34 标签: java

OFBIZ webservice简介

 

Opentaps(OFBiz 9.04之后)中webservice用的是AXIS2,最开始自己在网上搜了好多资料,自己拿回来测试,发现都不对。后自己再找了下AXIS的资料说,那种报错很有可能是由于两个版本不对引起的,所以就决定看看OFBiz里面用的是哪个版本,当时我彻底无语了,里面两个版本的包竟然都有,真不知道是什么意思。但是我认为应该是AXIS2,OFBiz这么与时俱进的东西,应该不太可能用06年就不更新的架包。

废话少说,直接说开发步骤吧:

一:在项目中引入AXIS2,由于AXIS2的依赖包好几个,客户端应该不需要那么多,但是以防万一,我们把AXIS2下面lib目录的所有jar包一并加入到开发工程的classpath下。

 

 

 

二:开发webservice必须知道wsdl才能比较好的。首先我们在OFBiz中打开一个service,让它能被发不成webservice。这个非常简单,在OFBiz中你只要在service定义的xml中,把要发布的service添加一个属性export=”true”,重启服务就能看到。下面以一个实例来说明:

<!--[if !supportLists]-->① <!--[endif]-->:我们找到application/order/servicedef/services.xml文件,打开找到最后一个service,这里有个自带的SOAP测试服务,我们添加一个service,export="true"加上去,最后变成:

 

方法java代码为:

 

<!--[if !supportLists]-->② <!--[endif]-->:现在只是发布了,但是我们必须要知道怎样请求才能得到这个服务,ofbiz提供了一个event来处理它,就是<handler name="soap" type="request" class="org.ofbiz.webapp.event.SOAPEventHandler"/>,要使用它,你必须把这个定义在你的controller.xml文件中,当然,如果你已经引入了<include location="component://common/webcommon/WEB-INF/common-controller.xml"/>,那么就不需要了,这个里面已经定义好了。直接使用就行了。

 

<!--[if !supportLists]-->③ <!--[endif]-->重启服务,在浏览器中输入

http://localhost:8080/ordermgr/control/SOAPServices/testSoap?wsdl,如果你看到了你刚才发布的服务,说明已经成功。如下图:

 

三:客户端编写。

客户端代码编写最主要是要知道服务端想要的是什么东西,首先我们的服务类的定义我们可以看到是需要一个输入输出,一个输入,三个输出的,也就是两个进,两个出。在wsdl中我们可以看到

 

 

说明我们需要传入的是一个map-Map形式的Model,并且salt和userid是必须的。由于我们没有设置验证信息,所以login.username和login.password是可以不需要的。直接上代码比较好一些。

在测试的时候我仅仅弄了一个很简单的例子,由于axiom比较复杂,还要详细研究下。类说明:ClientGenricValue,封装的是要传入数据的类型,键key和值。ClientUtil

package com.wx;

 

public class ClientGenericValue {

 

private String type;

private String key;

private String value;

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

public String getKey() {

return key;

}

public void setKey(String key) {

this.key = key;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

 

 

}

 

 

package com.wx;

 

import java.util.List;

 

import org.apache.axiom.om.OMAbstractFactory;

import org.apache.axiom.om.OMElement;

import org.apache.axiom.om.OMFactory;

import org.apache.axiom.om.OMNamespace;

import org.apache.axis2.AxisFault;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.client.ServiceClient;

 

public class ClientUtil {

 

private static OMFactory factory = OMAbstractFactory.getOMFactory();

private String endPoint;

private List<ClientGenericValue> valueList;

private String om;

private String serviceName;

 

public ClientUtil(String endPoint, String serviceName , String om,

List<ClientGenericValue> valueList) {

this.endPoint = endPoint;

this.serviceName = serviceName;

this.om = om;

this.valueList = valueList;

}

 

 

 

public ServiceClient createClient() throws AxisFault {

ServiceClient client = new ServiceClient();

Options options = new Options();

 

EndpointReference targetERP = new EndpointReference(endPoint); //定义目的EndpointReference,就是服务地址

options.setTo(targetERP);

options.setTimeOutInMilliSeconds(400000); //定义超时,这里可以不定义

 

client.setOptions(options);

return client;

}

 

public OMElement send() throws AxisFault{

OMNamespace ns = factory.createOMNamespace("http://ofbiz.apache.org/service/", serviceName);

OMElement root = factory.createOMElement(serviceName, ns);

 

OMElement data = factory.createOMElement("map-HashMap", null);

root.addChild(data);

for(ClientGenericValue value : valueList){

OMElement mapKey = factory.createOMElement("map-Entry", null);

 

OMElement keyElement = factory.createOMElement("map-Key", null);

OMElement keyValue = factory.createOMElement("std-String", null);

keyValue.addAttribute(factory.createOMAttribute("value", null, value.getKey()));

keyElement.addChild(keyValue);

 

 

OMElement valueElement = factory.createOMElement("map-Value", null);

OMElement valueValue = factory.createOMElement(value.getType(), null);

valueValue.addAttribute(factory.createOMAttribute("value", null, value.getValue()));

valueElement.addChild(valueValue);

 

mapKey.addChild(keyElement);

mapKey.addChild(valueElement);

 

data.addChild(mapKey);

}

System.out.println(root);

OMElement result = createClient().sendReceive(root);

return result;

}

 

 

 

public String getEndPoint() {

return endPoint;

}

 

public void setEndPoint(String endPoint) {

this.endPoint = endPoint;

}

 

}

 

package com.wx;

 

import java.util.ArrayList;

import java.util.List;

 

import org.apache.axiom.om.OMElement;

import org.apache.axis2.AxisFault;

 

public class ClientTest {

 

/**

* @param args

* @throws AxisFault

*/

public static void main(String[] args) {

String endPoint = "http://localhost:8080/ordermgr/control/SOAPServices/testSoap";

String serviceName = "testSoap";

String om = "http://ofbiz.apache.org/service/";

List<ClientGenericValue> valueList = getTestData();

 

 

ClientUtil cu = new ClientUtil(endPoint, serviceName, om, valueList);

 

try {

OMElement result = cu.send();

System.out.println("Sent Hello, got : " + result.toString());

} catch (AxisFault e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

}

 

public static List<ClientGenericValue> getTestData(){

List<ClientGenericValue> valueList = new ArrayList<ClientGenericValue>();

ClientGenericValue value1 = new ClientGenericValue();

value1.setType("std-String");

value1.setKey("userid");

value1.setValue("11111");

 

ClientGenericValue value2 = new ClientGenericValue();

value2.setType("std-String");

value2.setKey("salt");

value2.setValue("The power of OFBiz");

 

// ClientGenericValue value3 = new ClientGenericValue();

// value3.setType("eeval-OrderItemTypeAttr");

// value3.setKey("testing");

// value3.setValue("org.ofbiz.entity.GenericValue"); //这个可以不用填写的

 

valueList.add(value1);

valueList.add(value2);

// valueList.add(value3);

return valueList;

}

}

 


http://www.niftyadmin.cn/n/1051880.html

相关文章

bean:parameter

bean:parameter查询HTTP请求参数 用于取回请求中的参数值。如果没有指定multiple属性则依据刚取回的值创建一个String类型的bean。如果指定了multiple属性则依据刚取回的值创建一个String[]类型的数组。然后用id属性值将String或String[]绑定到page作用域中(这种绑定是为了其它…

bean:include

bean:include标签不同于JSP里的<jsp:include>之处是此把把包含内容放在一个变量&#xff0c;用时取出 对指定url(由forward、href或page确定)处的资源做一个请求&#xff0c;将响应数据作为一个String类型的bean绑定到page作用域&#xff0c;同时创建一个scripting变量。…

Jenkins 发布.NetCore 项目

安装最新Jenkins及安装好相关git插件 启动jenkins服务&#xff0c;访问8080端口 这里就发布一个IdentityServer4程序 配置相关参数 设置Git源码管理配置 构建执行window 批处理 查看目录下已经发布成功 转载于:https://www.cnblogs.com/liyouming/p/9283345.html

Reading papers_15(Graph cuts optimization for multi-limb human segmentation in depth maps)

如果大家有用过kinect做开发&#xff0c;不管是使用kinect SDK还是使用OpenNI&#xff0c;估计都对这些库提供的人体骨骼跟踪技术有一定的好奇&#xff0c;心里在想&#xff0c;每个人穿的衣服不同&#xff0c;身体特点也不同&#xff0c;所处的环境不同&#xff0c;且走路或做…

Struts提供的标签作用

依据功能和使用习惯的不同被分到了五个标签库中: Bean Tags:该标签库包含的标签可以用来创建bean、访问bean和访问bean的属性。同时提供了依据cookies、headers和parameters的值创建相关bean的能力。 HTML Tags:该标签库包含的标签可以用来创建Struts输入表单。 Logic Tags:该…

Matlab批量获取子文件夹与文件名

批量得到父文件夹下所有子文件夹的路径的MATLAB函数。 function [SubFolders] GetFolders(ParentFolder) %GetFolders % 函数功能为获取父文件夹下所有子文件夹的路径 % 函数的输入为ParentFolder&#xff1a;父文件夹路径。eg: D:\Program Files % 函数的输出为SubFolders&a…

网站首页必须具备哪些内容?

首页的作用&#xff1a; 如果说电子商务网站中首页并不是“最重要的”&#xff0c;你信吗?电商老手们一般花力气最大的是产品详细页&#xff0c;因为详细页能带来直接的购买转化&#xff0c;是整个电商网站的灵魂。电子商务站点中&#xff0c;产品详细页才是真正的LandingPage…

NASA HEG tool安装心得

自从NASA对MRT工具停止支持后&#xff0c;这个工具的官网也随之打不开无法下载。处理数据当然还是需要官方的工具好一些。 现在NASA推荐使用HEG工具来处理MODIS系列产品&#xff0c;除此之外工具对ASTER, MISR, AIRS, and AMSR-E HDF-EOS data sets.It also handles OMI HDF-EO…