Apache CXF Spring SOAP MTOM example

1. 环境说明

jdk 1.6.0-29

apache cxf 2.7.7

2. 新建web project,并添加apache cxf/lib目录下所需jar,软件目录如下:

Apache CXF Spring SOAP MTOM example_第1张图片

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. 程序测试,运行客户端

你可能感兴趣的:(apache,CXF,SOAP,jax-ws,mtom,spring.)