您的位置:首页 > 其它

cxf快速发布webService之aegis

2014-08-14 10:38 232 查看
好一段时间都在做接口,以前有用axis2来做接口,后面在项目中有接触到cxf,看了相关的文档,个人就觉得,cxf做接口挺爽的,个人空闲时就开始了对cxf的学习。学习新的技术,新的语言,个人喜欢首先看demo,先把程序跑起来、看看效果,一般demo引入工程或多或少多会出点问题,可能是环境问题、少jar、版本不一致、与原有工程的东西冲突,等等。

cxf也有提供的样例,笔记中给出的样例比较简单易懂,记下笔记也是供后面用到这方面的技术,能快速使用上手。

开发环境:eclipse-jee-kepler-R-win32、jdk-7u3-windows-i586、内嵌web应用服务器jetty。

这是个maven项目,相关的项目定义、依赖由maven管理,样例结构预览:



cxf使用aegis绑定数据,自己主要关心服务代码的实现,aegis负责生成xml schema/wsdl
xml,aegis测试项目主要提供了一个接口LuckyService,两个方法:获取城市天气、保存城市天气。

1、LuckyService代码清单

/**

* LuckyService.java

* com.toplucky.server

* Function:(一句话功能说明)

* version date author

* ──────────────────────────────────────

* Ver 1.0 2014年8月13日 CWL

* Copyright(c) 2014, happyweekend All Rights Reserved.

*/

package com.toplucky.server;

/**

* (一句话功能说明)

* @author CWL

* @version 1.0

* @see

* @since 1.0

* @Date 2014年8月13日 上午10:53:20

*/

public interface LuckyService {

/**

* getCityWeather:获取城市天气

* @param cityCode 城市code

* @return

*/

Weather getCityWeather(String cityCode);

/**

* saveWeather:新增

* @param weather

* @return

*/

boolean saveWeather(Weather weather);

}

2、接口实现LuckyServiceImpl代码清单

/**

* LuckyServiceImpl.java

* com.toplucky.server

* Function:(一句话功能说明)

* version date author

* ──────────────────────────────────────

* Ver 1.0 2014年8月13日 CWL

* Copyright(c) 2014, happyweekend All Rights Reserved.

*/

package com.toplucky.server;

import java.util.Date;

import net.sf.json.JSONObject;

import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.HttpStatus;

import org.apache.commons.httpclient.methods.GetMethod;

import org.apache.commons.httpclient.params.HttpMethodParams;

import org.apache.commons.httpclient.util.DateUtil;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

/**

* (一句话功能说明)

* @author CWL

* @version 1.0

* @see

* @since 1.0

* @Date 2014年8月13日 上午11:13:07

*/

public class LuckyServiceImpl implements LuckyService {

private static final Logger logger = LoggerFactory.getLogger(LuckyServiceImpl.class);

@Override

public Weather getCityWeather(String cityCode) {

Weather weather = new Weather();

String uri = "http://www.weather.com.cn/data/cityinfo/" + cityCode + ".html";

HttpClient httpClient = new HttpClient();

GetMethod getMethod = new GetMethod(uri);

getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,

new DefaultHttpMethodRetryHandler());

try {

int statusCode = httpClient.executeMethod(getMethod);

if (statusCode != HttpStatus.SC_OK) {

logger.error("Method failed: " + getMethod.getStatusLine());

}

byte[] responseBody = getMethod.getResponseBody();

String responseStr = new String(responseBody);

JSONObject jsonObject = JSONObject.fromObject(responseStr);

Object temp = jsonObject.get("weatherinfo");

if (temp instanceof JSONObject){

JSONObject wtInfo = (JSONObject) temp;

//"temp1":"0℃","temp2":"10℃",

boolean temp1Lower = false;

String temp1 = wtInfo.get("temp1") + "";

String temp2 = wtInfo.get("temp2") + "";

StringBuilder wtBuilder = new StringBuilder();

wtBuilder.append(wtInfo.get("city")).append(" ")

.append(wtInfo.get("weather")).append(" ");

if (temp1.length() < temp2.length()) temp1Lower = true;

else if (temp1.length() == temp2.length()) {

if (temp1.compareTo(temp2) <= 0) temp1Lower = true;

}

if (temp1Lower) wtBuilder.append(temp1).append("~").append(temp2);

else wtBuilder.append(temp2).append("~").append(temp1);

weather.setDesc(wtBuilder.toString());

weather.setTime(DateUtil.formatDate(new Date(), "yyyy年MM月dd日 HH:mm"));

}

} catch (Exception e){

e.printStackTrace();

} finally {

getMethod.releaseConnection();

}

return weather;

}

@Override

public boolean saveWeather(Weather weather) {

logger.info("call saveWeather...");

logger.info("saveWeather.time=" + weather.getTime());

logger.info("saveWeather.weather=" + weather.getDesc());

return true;

}

}

3、气候Weather代码清单

/**

* Weather.java

* com.toplucky.server

* Function:(一句话功能说明)

* version date author

* ──────────────────────────────────────

* Ver 1.0 2014年8月13日 CWL

*

* Copyright(c) 2014, happyweekend All Rights Reserved.

*/

package com.toplucky.server;

/**

* (一句话功能说明)

* @author CWL

* @version 1.0

* @see

* @since 1.0

* @Date 2014年8月13日 上午10:58:52

*/

public class Weather {

// 2013年12月25日 11:52

private String time;

// 成都 阴 10 ℃~ 0 ℃

private String desc;

public String getTime() {

return time;

}

public void setTime(String time) {

this.time = time;

}

public String getDesc() {

return desc;

}

public void setDesc(String desc) {

this.desc = desc;

}

@Override

public String toString() {

return "Weather [time=" + time + ", desc=" + desc + "]";

}

}

这样一个获取天气的接口代码就算完成了,这里需要根据接口LuckyService配置aegis的一个文件LuckyService.aegis.xml,

相关配置会在生成的WSDL中体现

4、LuckyService.aegis.xml代码清单

<?xml version="1.0" encoding="UTF-8"?>

<mappings>

<mapping name="LuckyService">

<method name="getCityWeather">

<parameter index="0" mappedName="cityCode" nillable='false' />

</method>

<method name="saveWeather">

<parameter index="0" mappedName="weather" nillable='false' />

</method>

</mapping>

</mappings>

这样发布一个接口的准备工作已完成,接下来就是将接口发布出来供外部调用

5、发布接口类LuckyServer代码清单

/**

* LuckyServer.java

* com.toplucky.server

*

* Function:(一句话功能说明)

*

* version date author

* ──────────────────────────────────────

* Ver 1.0 2014年8月13日 CWL

*

* Copyright(c) 2014, happyweekend All Rights Reserved.

*/

package com.toplucky.server;

import org.apache.cxf.aegis.databinding.AegisDatabinding;

import org.apache.cxf.frontend.ServerFactoryBean;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

/**

* (一句话功能说明)

* @author CWL

* @version 1.0

* @see

* @since 1.0

* @Date 2014年8月13日 下午2:21:26

*/

public class LuckyServer {

private static final Logger logger = LoggerFactory.getLogger(LuckyServer.class);

public static void main(String[] args) throws InterruptedException {

LuckyServiceImpl luckyServiceImpl = new LuckyServiceImpl();

ServerFactoryBean svrFactory = new ServerFactoryBean();

svrFactory.setServiceClass(LuckyService.class);

svrFactory.setAddress("http://localhost:8089/lucky");

svrFactory.setServiceBean(luckyServiceImpl);

svrFactory.getServiceFactory().setDataBinding(new AegisDatabinding());

svrFactory.create();

logger.info("LuckyServer ready...");

}

}

6、客户端测试类LuckyClient代码清单

/**

* LuckyClient.java

* com.toplucky.client

*

* Function:(一句话功能说明)

* version date author

* ──────────────────────────────────────

* Ver 1.0 2014年8月13日 CWL

* Copyright(c) 2014, happyweekend All Rights Reserved.

*/

package com.toplucky.client;

import org.apache.cxf.aegis.databinding.AegisDatabinding;

import org.apache.cxf.frontend.ClientProxyFactoryBean;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.toplucky.server.LuckyService;

import com.toplucky.server.Weather;

/**

* (一句话功能说明)

*

* @author CWL

* @version 1.0

* @see

* @since 1.0

* @Date 2014年8月13日 下午2:14:47

*/

public class LuckyClient {

private static final Logger logger = LoggerFactory.getLogger(LuckyClient.class);

public static void main(String args[]) throws Exception {

ClientProxyFactoryBean factory = new ClientProxyFactoryBean();

factory.setAddress("http://localhost:8089/lucky");

factory.getServiceFactory().setDataBinding(new AegisDatabinding());

LuckyService client = factory.create(LuckyService.class);

logger.info("Invoke getCityWeather()....");

Weather weather = client.getCityWeather("101270101");

if (weather != null)

logger.info(weather.toString());

logger.info("Invoke saveWeather()....");

boolean success = client.saveWeather(weather);

logger.info(success + "");

}

}

WSDL地址:http://localhost:8089/lucky?wsdl,使用cxf生成客户端调用类LuckyServicePortType_LuckyServicePort_Client代码清单

package com.toplucky.server;

/**

* Please modify this class to meet your needs

* This class is not complete

*/

import java.io.File;

import java.net.MalformedURLException;

import java.net.URL;

import javax.xml.bind.JAXBElement;

import javax.xml.namespace.QName;

/**

* This class was generated by Apache CXF 2.7.7

* 2014-08-13T15:11:50.015+08:00

* Generated source version: 2.7.7

*/

public final class LuckyServicePortType_LuckyServicePort_Client {

private static final QName SERVICE_NAME = new QName("http://server.toplucky.com/", "LuckyService");

private LuckyServicePortType_LuckyServicePort_Client() {

}

public static void main(String args[]) throws java.lang.Exception {

URL wsdlURL = LuckyService.WSDL_LOCATION;

if (args.length > 0 && args[0] != null && !"".equals(args[0])) {

File wsdlFile = new File(args[0]);

try {

if (wsdlFile.exists()) {

wsdlURL = wsdlFile.toURI().toURL();

} else {

wsdlURL = new URL(args[0]);

}

} catch (MalformedURLException e) {

e.printStackTrace();

}

}

LuckyService ss = new LuckyService(wsdlURL, SERVICE_NAME);

LuckyServicePortType port = ss.getLuckyServicePort();

{

System.out.println("Invoking getCityWeather...");

java.lang.String _getCityWeather_cityCode = "101270101";

com.toplucky.server.Weather _getCityWeather__return = port.getCityWeather(_getCityWeather_cityCode);

System.out.println("getCityWeather.time=" + _getCityWeather__return.getTime().getValue());

System.out.println("getCityWeather.desc=" + _getCityWeather__return.getDesc().getValue());

}

{

QName _WeatherDesc_QNAME = new QName("http://server.toplucky.com", "desc");

QName _WeatherTime_QNAME = new QName("http://server.toplucky.com", "time");

System.out.println("Invoking saveWeather...");

com.toplucky.server.Weather _saveWeather_weather = new com.toplucky.server.Weather();

javax.xml.bind.JAXBElement<java.lang.String> _saveWeather_weatherTime = new JAXBElement<String>(_WeatherTime_QNAME, String.class, "2014年08月13日 07:22");

_saveWeather_weather.setTime(_saveWeather_weatherTime);

javax.xml.bind.JAXBElement<java.lang.String> _saveWeather_weatherDesc = new JAXBElement<String>(_WeatherDesc_QNAME, String.class, "成都 多云 21℃~31℃");

_saveWeather_weather.setDesc(_saveWeather_weatherDesc);

boolean _saveWeather__return = port.saveWeather(_saveWeather_weather);

System.out.println("saveWeather.result=" + _saveWeather__return);

}

System.exit(0);

}

}

cxf绑定aegis发布服务简单、快速,接口以及接口调用客户端所有代码都已上传

地址:http://download.csdn.net/detail/check_null/7753161
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: