快速使用Spring 2.5 和 Apache CXF 2.0, 以前的Xfire创建webServ
在这个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/jaxwshttp://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]