依然使用 JAX-WS(jdk自带的实现)方式,这次要在服务中使用一个复杂类型Customer,并实现附件传输的功能,这里使用MTOM的附件传输方式。MTOM(SOAP Message Transmission Optimization Mechanism)是SOAP 消息传输优化机制,MTOM可以在SOAP 消息中发送二进制数据。
先来看Customer类:
MTOM 方式中要传输的附件必须使用javax.activation.DataHandler 类,还要注意必须在类上使用@XmlAccessorType(FIELD)注解,标注JAXB 在进行JAVA 对象与XML 之间进行转换时只关注字段,而不关注属性(getXXX()方法),否则发布Web 服务时会报出现了两个imageData 属性的错误,原因未知,可能是BUG。
然后使用@XmlMimeType 注解标注这是一个附件类型的数据,这里我们标注imageData 是一个二进制文件,当然你也可以使用具体的MIME类型,譬如:image/jpg、image/gif 等,但要考虑到客户端是否支持。
接口类:
@MTOM注解用于开启MTOM功能。
@WebService注解中的name属性标注在接口类上,可以指定wsdl中接口名称,也就是生成的客户端代码中接口类的名字。
@SOAPBinding(style = SOAPBinding.Style.RPC)指定SOAP消息样式,有两个枚举值:SOAPBinding.Style.DOCUMENT(默认)和SOAPBinding.Style.RPC,可以对比这两种方式生成的wsdl会有所不同,而且生成的客户端代码也会有所不同。
实现类:
在这个类中,通过@Resource注解注入了一个WebServiceContext对象,这个对象即是WebService的上下文环境。
发布这个服务:
- package com.why.server;
- import javax.xml.ws.Endpoint;
- /**
- *
- * @author why
- *
- */
- public class SoapServer {
- public static void main(String[] args) {
- Endpoint.publish("http://localhost:8080/helloService",new HelloImpl());
- }
- }
在命令行键入“wsimport -p com.why.client -keep http://localhost:8080/helloService?wsdl”生成客户端代码,拷贝到工程相应文件夹里,这时,就可以调用这个服务了:
- package com.why.client;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.GregorianCalendar;
- import javax.activation.DataHandler;
- import javax.activation.DataSource;
- import javax.activation.FileDataSource;
- import javax.xml.datatype.DatatypeConfigurationException;
- import javax.xml.datatype.DatatypeFactory;
- import javax.xml.namespace.QName;
- /**
- *
- * @author why
- *
- */
- public class SoapClient {
- public static void main(String[] args) throws ParseException, MalformedURLException {
- QName qName = new QName("http://service.why.com/","HelloService");
- HelloService helloService = new HelloService(new URL("http://127.0.0.1:8080/helloService?wsdl"),qName);
- Hello hello = (Hello) helloService.getPort(Hello.class);
- hello.printContext();
- System.out.println("---------------------------------------------------");
- Customer customer = new Customer();
- customer.setName("why");
- DataSource ds = hello.selectCustomerByName(customer).getImageData().getDataSource();
- String attachmentMimeType = ds.getContentType();
- System.out.println(attachmentMimeType);
- try {
- InputStream is = ds.getInputStream();
- OutputStream os = new FileOutputStream("c:\\why_temp.jpg");
- byte[] bytes = new byte[1024];
- int c;
- while ((c = is.read(bytes)) != -1) {
- os.write(bytes, 0, c);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- System.out.println("########################################");
- Customer c1 = new Customer();
- c1.setId(1);
- c1.setName("why");
- GregorianCalendar calendar = (GregorianCalendar)GregorianCalendar.getInstance();
- calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse("1985-10-07"));
- try {
- c1.setBirthday(DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar));
- } catch (DatatypeConfigurationException e) {
- e.printStackTrace();
- }
- c1.setImageData(new DataHandler(new FileDataSource("c:\\c1.jpg")));
- Customer c2 = new Customer();
- c2.setId(2);
- c2.setName("abc");
- calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse("1986-10-07"));
- try {
- c2.setBirthday(DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar));
- } catch (DatatypeConfigurationException e) {
- e.printStackTrace();
- }
- c2.setImageData(new DataHandler(new FileDataSource("c:\\c2.jpg")));
- Customer c = hello.selectMaxAgeCustomer(c1,c2);
- System.out.println(c.getName());
- }
- }