设为首页 收藏本站
查看: 462|回复: 0

[经验分享] 快速使用Spring 2.5 和 Apache CXF 2.0, 以前的Xfire创建webServ

[复制链接]

尚未签到

发表于 2017-1-14 07:41:03 | 显示全部楼层 |阅读模式
在这个Demo中我如何使用Spring 2.5 和 Apache CXF 2.0建立和运行一个web service。我非常喜欢CXF它同时支持WSDL-first 和 Java-first web service 开发。这个示例中使用的是Java-first web service。
项目SETUP
1.去CXF下一个Apache CXF,现在已经是2.1.2了。官方网站上有一section of the CXF user documentation that deals with writing a service with Spring,对新手应该有一些用。在那个示例中只是返回了一个string. 我们试着返回一些复杂的内容,试着使用databinding。
项目需要的JAR
CXF itself
·cxf.jar
CXF dependencies
·commons-logging-1.1.jar
·geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar)
·geronimo-annotation_1.0_spec-1.1.jar (JSR 250)
·geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)
·geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar)
·geronimo-stax-api_1.0_spec-1.0.jar
·geronimo-ws-metadata_2.0_spec-1.1.1.jar (JSR 181)
·jaxb-api-2.0.jar
·jaxb-impl-2.0.5.jar
·jaxws-api-2.0.jar
·neethi-2.0.2.jar
·saaj-api-1.3.jar
·saaj-impl-1.3.jar
·wsdl4j-1.6.1.jar
·wstx-asl-3.2.1.jar
·XmlSchema-1.3.2.jar
·xml-resolver-1.2.jar
Aegis dependencies
jdom-1.0.jar Aegis databinding 需要
jaxen-1.1.1.jar
cxf-rt-databinding-aegis-2.1.2.jar
Spring dependencies
这个就参照常用spring配置了
下面废话少说,开始
创建一个表Vendor的Maintains
Create the object model
内容和HelloWorld差不多,但使用了一些XMl Binding的能力

import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Transient;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.hibernate.annotations.Type;

@Entity
public class Vendor extends AbstractBaseEntity {
/**
*
*/
private static final long serialVersionUID = -8346265790105564327L;
private String VendorID;
private String EngName;
private String ChnName;
private String Street1;
private String Street2;
private String City;
private String ProvinceID;
private String Zip;
private String PoTel;
private String PoFax;
private String PoContact;
private String PoEmail;
private String ApTel;
private String ApFax;
private String ApContact;
private String ApEmail;
private String ProductContract;
private Integer MinOrderQty;
private BigDecimal MinOrderAmount;
private Integer Msi;
private String Language;
private String Status;
private Integer PoSentBy;
private String ApTerms;
private String FobCode;
private String ShipVia;
private String VendorType;
private Date ChgTime;
private String ChgBy;
@Id
public String getVendorID() {
return VendorID;
}
public void setVendorID(String vendorID) {
this.VendorID = vendorID;
}

public String getApContact() {
return ApContact;
}
public void setApContact(String contact) {
ApContact = contact;
}

public String getApEmail() {
return ApEmail;
}
public void setApEmail(String email) {
ApEmail = email;
}

public String getApFax() {
return ApFax;
}
public void setApFax(String fax) {
ApFax = fax;
}

public String getApTel() {
return ApTel;
}
public void setApTel(String tel) {
ApTel = tel;
}

public String getApTerms() {
return ApTerms;
}
public void setApTerms(String terms) {
ApTerms = terms;
}
public String getChgBy() {
return ChgBy;
}
public void setChgBy(String chgBy) {
this.ChgBy = chgBy;
}
public Date getChgTime() {
return ChgTime;
}
public void setChgTime(Date chgTime) {
this.ChgTime = chgTime;
}
public String getChnName() {
return ChnName;
}
public void setChnName(String chnName) {
this.ChnName = chnName;
}

public String getCity() {
return City;
}
public void setCity(String city) {
this.City = city;
}

public String getEngName() {
return EngName;
}
public void setEngName(String engName) {
this.EngName = engName;
}

public String getFobCode() {
return FobCode;
}
public void setFobCode(String code) {
FobCode = code;
}

public String getLanguage() {
return Language;
}
public void setLanguage(String language) {
this.Language = language;
}
public BigDecimal getMinOrderAmount() {
return MinOrderAmount;
}
public void setMinOrderAmount(BigDecimal minOrderAmount) {
this.MinOrderAmount = minOrderAmount;
}
public Integer getMinOrderQty() {
return MinOrderQty;
}
public void setMinOrderQty(Integer minOrderQty) {
this.MinOrderQty = minOrderQty;
}
public Integer getMsi() {
return Msi;
}
public void setMsi(Integer msi) {
Msi = msi;
}
public String getPoContact() {
return PoContact;
}
public void setPoContact(String contact) {
PoContact = contact;
}

public String getPoEmail() {
return PoEmail;
}
public void setPoEmail(String email) {
PoEmail = email;
}
public String getPoFax() {
return PoFax;
}
public void setPoFax(String fax) {
PoFax = fax;
}
public Integer getPoSentBy() {
return PoSentBy;
}
public void setPoSentBy(Integer sentBy) {
PoSentBy = sentBy;
}
public String getPoTel() {
return PoTel;
}
public void setPoTel(String tel) {
PoTel = tel;
}

public String getProductContract() {
return ProductContract;
}
public void setProductContract(String productContract) {
this.ProductContract = productContract;
}

public String getProvinceID() {
return ProvinceID;
}
public void setProvinceID(String provinceID) {
this.ProvinceID = provinceID;
}

public String getShipVia() {
return ShipVia;
}
public void setShipVia(String shipVia) {
this.ShipVia = shipVia;
}

public String getStatus() {
return Status;
}
public void setStatus(String status) {
this.Status = status;
}
public String getStreet1() {
return Street1;
}
public void setStreet1(String street1) {
this.Street1 = street1;
}

public String getStreet2() {
return Street2;
}
public void setStreet2(String street2) {
this.Street2 = street2;
}

public String getVendorType() {
return VendorType;
}
public void setVendorType(String vendorType) {
this.VendorType = vendorType;
}

public String getZip() {
return Zip;
}
public void setZip(String zip) {
this.Zip = zip;
}

@Override
public boolean equals(Object o) {
if (!(o instanceof Vendor)) {
return false;
}
Vendor rhs = (Vendor) o;
return new EqualsBuilder()
.append(StringUtils.trim(this.getVendorID()), StringUtils.trim(rhs.getVendorID())).isEquals();
}
@Override
@Transient
@IgnoreProperty
public String getId() {
return this.getVendorID();
}
public void setId(String vendorID) {
this.setVendorID(vendorID);
}
@Override
public int hashCode() {
return new HashCodeBuilder(732005277, -727069309).append(
this.getVendorID()).hashCode();
}
@Override
public String toString() {
return new ToStringBuilder(this).append("VendorID", this.getVendorID())
.toString();
}
}


其中@IgnoreProperty annotation是Aegis databinding的一部分。相当于告诉该字段是只读的。
创建 service interface

import java.util.List;
import javax.jws.WebService;
import javax.jws.WebParam;

@WebService
public interface VendorMaintenance {

public Vendor get(String vendorID);

public void add(@WebParam(name = "vendor") Vendor vendor);
public List<Vendor> getList();

}

@WebService 和@WebParam是JAX-WS annotations。如果你想完整的标注就看文档去。
创建实现类

import java.util.List;
import javax.jws.WebService;

@WebService(endpointInterface = "webservice.VendorMaintenance")
public class VendorMaintenanceImpl implements VendorMaintenance {
private DAO<Vendor> vendorDao;
public void setVendorDao(DAO<Vendor> vendorDao) {
this.vendorDao = vendorDao;
}
public void add(Vendor vendor) {
try {
this.vendorDao.save(vendor);
} catch (Exception e) {
throw new BusinessException(e.getMessage());
}
}
public Vendor get(String vendorID) {
return this.vendorDao.get(vendorID);
}
public List<Vendor> getList() {
// TODO Auto-generated method stub
return this.vendorDao.getList();
}

我用的是Hibernate,反正就是给一个结果。
@WebService 再次标注这是一个Web Service

创建配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- START SNIPPET: beans -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws  http://cxf.apache.org/schemas/jaxws.xsd">

<!-- Load CXF modules from cxf.jar -->
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- Enable message logging using the CXF logging feature
<cxf:bus>
<cxf:features>
<cxf:logging></cxf:logging>
</cxf:features>
</cxf:bus>-->
<!-- The service bean -->
<bean id="VendorMaintenanceImpl"
class="com.mms.webservice.VendorMaintenanceImpl">
<property name="vendorDao">
<ref bean="otherVendorDao" />
</property>
</bean>
<!-- Aegis data binding -->
<bean id="aegisBean"
class="org.apache.cxf.aegis.databinding.AegisDatabinding"
scope="prototype" />
<bean id="jaxws-and-aegis-service-factory"
class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"
scope="prototype">
<property name="dataBinding" ref="aegisBean" />
<property name="serviceConfigurations">
<list>
<bean
class="org.apache.cxf.jaxws.support.JaxWsServiceConfiguration" />
<bean
class="org.apache.cxf.aegis.databinding.AegisServiceConfiguration" />
<bean
class="org.apache.cxf.service.factory.DefaultServiceConfiguration" />
</list>
</property>
</bean>
<!-- Service endpoint -->
<!-- See http://incubator.apache.org/cxf/faq.html regarding CXF + Spring AOP -->
<jaxws:endpoint id="vendorMaintenance"
implementorClass="com.mms.webservice.VendorMaintenanceImpl"
implementor="#VendorMaintenanceImpl" address="/VendorMaintenance">
<jaxws:serviceFactory>
<ref bean="jaxws-and-aegis-service-factory" />
</jaxws:serviceFactory>
</jaxws:endpoint>

<jaxws:endpoint id="helloWorld"
implementor="com.mms.webservice.HelloWorldImpl"
address="/HelloWorld" />
</beans>
<!-- END SNIPPET: beans -->


注意Aegis data binding部分就是数据绑定了。我采用的是默认绑定。还可以自己定义绑定。这里有一个问题。加了CXF:BUS但始终报错,以后解决了。然后发布,写出客户端就可以了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-328069-1-1.html 上篇帖子: Apache通用日志工具commons-logging和Log4j 使用总结(转载) . 下篇帖子: JBOSS 4.23GA+Apache 2.2.11 负载均衡详细介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表