1. 环境说明
jdk 1.6.0-29
apache cxf 2.7.7
2. 新建web project,并添加apache cxf/lib目录下所需jar,软件目录如下:
3. 程序代码
Book.java
package com.unei.bean; import javax.activation.DataHandler; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlMimeType; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "Book") @XmlAccessorType(XmlAccessType.FIELD) public class Book { private int bookId; private String bookISBNnumber; private String bookName; private double price; private String author; @XmlMimeType("application/octet-stream") private DataHandler image; public DataHandler getImage() { return image; } public void setImage(DataHandler image) { this.image = image; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getBookId() { return bookId; } public void setBookId(int bookId) { this.bookId = bookId; } public String getBookISBNnumber() { return bookISBNnumber; } public void setBookISBNnumber(String bookISBNnumber) { this.bookISBNnumber = bookISBNnumber; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } }
IBookService.java
package com.unei.service; import javax.jws.WebMethod; import javax.jws.WebService; import com.unei.bean.Book; @WebService public interface IBookService { @WebMethod public void addBook(Book book)throws Exception ; @WebMethod public void deleteBook(int bookId); @WebMethod public void updateBook(Book book); @WebMethod public Book getBook(int bookId); }BookService.java
package com.unei.service.impl; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import javax.activation.DataHandler; import com.unei.bean.Book; import com.unei.service.IBookService; public class BookService implements IBookService { @Override public void addBook(Book book) throws Exception { System.out.println("addBook:" + book.getBookName()); DataHandler dh = book.getImage(); if (dh != null) { String fileName = dh.getName(); FileOutputStream out = new FileOutputStream(new File("E:"+File.separator+fileName)); byte[] b = new byte[1]; InputStream ins = dh.getInputStream(); while (ins.read(b) != -1) { out.write(b); } out.flush(); out.close(); ins.close(); }else{ System.out.println("image is null"); } } @Override public void deleteBook(int bookId) { System.out.println("deleteBook:" + bookId); } @Override public void updateBook(Book book) { System.out.println("updateBook:" + book.getBookName()); } @Override public Book getBook(int bookId) { Book book = new Book(); book.setBookId(4); book.setBookName("getBook"); book.setBookISBNnumber("ABCDEFG"); book.setPrice(20.00); return book; } }web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.4"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> </web-app>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd "> <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.xml" /> <aop:aspectj-autoproxy proxy-target-class="true" /> <bean id="bsServiceBean" class="com.unei.service.impl.BookService" /> <bean id="inLog" class="org.apache.cxf.interceptor.LoggingInInterceptor" /> <bean id="outLog" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/> <jaxws:server id="bookService" serviceClass="com.unei.service.IBookService" address="/bs"> <jaxws:properties> <entry key="mtom-enabled" value="true"/> </jaxws:properties> <jaxws:serviceBean> <ref bean="bsServiceBean" /> </jaxws:serviceBean> <jaxws:inInterceptors> <ref bean="inLog" /> </jaxws:inInterceptors> <jaxws:outInterceptors> <ref bean="outLog"/> </jaxws:outInterceptors> </jaxws:server> </beans>注意添加:
xmlns:jaxws="http://cxf.apache.org/jaxws"
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
<jaxws:..>标签中添加
<jaxws:properties>
<entry key="mtom-enabled" value="true"/>
</jaxws:properties>
JAX-WS默认禁用MTOM功能,客户端和服务器都要添加。
4. 程序测试
浏览器输入:http://localhost:8080/soap/services/bs?wsdl
浏览器输出wsdl文档
5. apache cxf生成客户端代码
wsdl2java -frontend jaxws21 -p com.unei.soap.client -d F:\ws http://localhost:8080/soap/services/bs?wsdl
6.客户端,项目结构如下:
7. 代码
Client.java
package com.unei.app; import java.io.File; import javax.activation.DataHandler; import javax.activation.FileDataSource; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.unei.soap.client.Book; import com.unei.soap.client.IBookService; public class Client { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); IBookService client=(IBookService)context.getBean("client"); Book b=new Book(); b.setBookId(1); b.setBookName("new book"); DataHandler dh=new DataHandler(new FileDataSource(new File("D:"+File.separator+"soap.png"))); if(dh!=null) b.setImage(dh); client.addBook(b); } }
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd "> <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.xml" /> <aop:aspectj-autoproxy proxy-target-class="true" /> <!-- <bean id="client" class="com.unei.soap.client.IBookService" factory-bean="clientFactory" factory-method="create"/> <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <property name="serviceClass" value="com.unei.soap.client.IBookService"/> <property name="address" value="http://localhost:8080/soap/services/bs"/> </bean> --> <jaxws:client id="client" serviceClass="com.unei.soap.client.IBookService" address="http://localhost:8080/soap/services/bs"> <jaxws:properties> <entry key="mtom-enabled" value="true"/> </jaxws:properties> </jaxws:client> </beans>
8. 程序测试,运行客户端