CXF+JAXB发布获取web

CXF有多种数据绑定方式,如:Aegis  Databinding,JAXB,MTOM Attachments . 其中JAXB(JavaTM Architecture for XML Binding)是其默认的数据绑定方式。JAXB是一套自动映射XMLJava实例的开发接口和工具。

如果web Service发布的接口为:

  String sayUserHello(User user); 

List<User> findUsers();

且传入参数类型是类,而且返回的为List ,String 等,这样,发布web service与普通java的没有区别,是因为JAXB都能支持。

JAXB不能将一些 Java 类型自然映射到 XML 表示形式,例如,HashMap 或其他非 JavaBean 类。如参数类型为接口,以及Map  ,这需要特殊的XmlAdapter类进行处理. 例如:

1、    编写要发布的web service 接口和实现

import javax.jws.WebService;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

 

@WebService

public interface HelloWorld {

    String sayHello(String text);

    String sayUserHello(User user);

    List<User> findUsers();

    @XmlJavaTypeAdapter(UserMapAdapter.class)

    Map<Integer, User> getMapUsers();

}

import java.util.ArrayList;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Map;

import javax.jws.WebService;

@WebService(endpointInterface = "test.HelloWorld",

            serviceName = "HelloWorld")

public class HelloWorldImpl implements HelloWorld {

     public String sayHello(String text) {

          return "Hello " + text;

      }

      public String sayUserHello(User user) {

         return "Hello " + (user!=null?user.getUsername():"guest");

     }

      public List<User> findUsers() {

      ArrayList<User> list = new ArrayList<User>();

      list.add(new UserImpl("aa","bb"));

      list.add(new UserImpl("aa1","bb"));

      list.add(new UserImpl("aa2","bb"));

      list.add(new UserImpl("aa3","bb"));

      return list;

     }

    public  Map<Integer,User>  getMapUsers() {

       Map<Integer, User> users = new LinkedHashMap<Integer, User>();

       users.put(1, new UserImpl("aa","bb"));

       users.put(2, new UserImpl("sss","sss"));

       return users;

  }

}

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

 

@XmlJavaTypeAdapter(UserAdapter.class)

public interface User {

    String getPassword();

    String getUsername();

    void setUsername(String username);

    void setPassword(String password);

    void setUserId(Integer userId);

    Integer getUserId();

}

@XmlType(name = "User")

public class UserImpl implements User {

    private Integer userId;

    private String username;

    private String password;

       public Integer getUserId() {

       return userId;

    }

    public void setUserId(Integer userId) {

       this.userId = userId;

    }

    public String getPassword() {

       return password;

    }

    public void setPassword(String password) {

       this.password = password;

    }

    public String getUsername() {

       return username;

    }

    public void setUsername(String username) {

       this.username = username;

    }

    public UserImpl(String username, String password) {

       super();

       this.username = username;

       this.password = password;

    }

    public UserImpl() {

    }

    public UserImpl(String username) {

       this.username = username;

    }

    public UserImpl(Integer userId, String username, String password) {

       this.userId = userId;

       this.username = username;

       this.password = password;

    }

  

}

2、    编写适配器

因为JAXB不支持将HashMap 或其他非 JavaBean 自然映射到xml表示形式,这样就要定义一个适配器使用java类型适应自定义编组.一般有两步:

1>. 编写一个类继承XmlAdapter,以实现此抽象类的适配器。

2>. 安装使用注释 XmlJavaTypeAdapter 的适配器。

 

XmlAdapter的说明:

XmlAdapter<ValueType,BoundType>

BoundType - JAXB 不知道如何处理的一些类型。编写一个适配器,以便允许通过 ValueType 将此类型用作内存表示形式。

ValueType - JAXB 无需其他操作便知道如何处理的类型。

其两个抽象方法:

marshal(...):编组过程中,JAXB 绑定框架调用 XmlAdapter.marshal(..) bound 类型修改为 value 类型,然后将 value 类型编组为 XML 表示形式。

unmarshal(...):解组过程中,JAXB 绑定框架首先将 XML 表示形式解组为 value 类型,然后调用 XmlAdapter.unmarshal(..) value 类型修改为 bound 类型。

 

常用的几个注释说明:

a.@XmlJavaTypeAdapter 注释可以与下列编程元素一起使用: JavaBean 属性 、字段、参数 、包 Cou

你可能感兴趣的:(编程,Web,xml,框架,webservice)