`
erichua
  • 浏览: 510967 次
  • 性别: Icon_minigender_2
  • 来自: 远方
社区版块
存档分类
最新评论

快速使用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
        [color=red]@IgnoreProperty[/color]
	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但始终报错,以后解决了。然后发布,写出客户端就可以了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics