处理Map、非javabean式的复合类等CXF无法自动转化的类型 (3)

一:CXF形参、返回值
      1:当形参和返回值的类型是String、基本数据类型是,CXF肯定可以轻松处理
      2:当形参和返回值的类型是javabean式的复合类(就是普通的POJO实体类)、List集合、数组等复杂类型时, CXF也可以很好处理。
      3:还有一些像Map、非javabean式的复合类,CXF是处理不了的

二:步骤如下
    1: 使用注解 @XmlJavaTypeAdapter(java自身的注解,可在jdkAPI文档中查到)修饰CXF无法自动处理的类型,使用该Annotation时,
       通过value属性指定一个转换器(自己定义)。@XmlJavaTypeAdapter (value="FKXmlAdapter.class")
    2: 实现自己定义的转化器,实现转化器时,需要开发一个CXF能够处理的类型。

三:代码
    1: 创建FKXmlAdapter类型 ,然后通过继承 XmlAdapter<ValueType,BoundType>类型,便可已将CXF不能处理的类型进行转 
      换。
jdkAPI中定义如下,valuType是能够处理的类型,boundType是不能处理的类型: 转化的实质是将不能处理的类型,
      如  Map,将其值取出,赋予另一个实体类,这个类模拟Map,保存他的值,这样便是可以进行相互转化。

    2: 需要定义一个Map  的模拟类,这样Map的key和value都保存在Entry类中(Entry自行定义,名字也可以随便,
      只要符合命名规范就行),所有的Entry保存在List中,这样一个Map集合就转化成了StringPlayer类,
      StringPlayer自然也可以转  化为Map类:

package com.lzw.springcxf.util;

import java.util.ArrayList;
import java.util.List;

import com.lzw.springcxf.model.PlayerModel;

public class StringPlayer {
	
	public static class Entry {
		
		private String key;
		
		private PlayerModel value;
		
		public Entry() {
		}

		public Entry(String key, PlayerModel value) {
			this.key = key;
			this.value = value;
		}
		
		public String getKey() {
			return key;
		}
		
		public void setKey(String key) {
			this.key = key;
		}
		
		public PlayerModel getValue() {
			return value;
		}
		
		public void setValue(PlayerModel value) {
			this.value = value;
		}
	}
     
	private List<Entry> entries = new ArrayList<Entry>();

	public List<Entry> getEntries() {
		return entries;
	}

	public void setEntries(List<Entry> entries) {
		this.entries = entries;
	}
}

package com.lzw.springcxf.util;

import java.util.HashMap;
import java.util.Map;

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

import com.lzw.springcxf.model.PlayerModel;
import com.lzw.springcxf.util.StringPlayer.Entry;

public class FKXmlAdapter extends XmlAdapter<StringPlayer, Map<String, PlayerModel>> {

	@Override
	public Map<String, PlayerModel> unmarshal(StringPlayer v) throws Exception {
		Map<String, PlayerModel> result = new HashMap<String, PlayerModel>();
		for (Entry entry:v.getEntries()) {
			result.put(entry.getKey(), entry.getValue());
		}
		return result;
	}

	@Override
	public StringPlayer marshal(Map<String, PlayerModel> v) throws Exception {
		StringPlayer player = new StringPlayer();
		for (String key : v.keySet()) {
			player.getEntries().add(new Entry(key, v.get(key)));
		}
		return player;
	}

}

ClubService接口增加代码

public Map<String, PlayerModel> getAllPlayers();

HandleService接口增加代码
public @XmlJavaTypeAdapter(FKXmlAdapter.class) Map<String, PlayerModel> getAllPlayers();

ClubServiceImpl类增加代码
@Override
	public  Map<String, PlayerModel> getAllPlayers() {
		Map<String, PlayerModel> result = new HashMap<String, PlayerModel>();
		int i = 1;
		for (List<PlayerModel> players:initData.values()) {
			for(PlayerModel player:players) {
				result.put("第"+ i++ + "位球员是:", player);
			}
		}
		return result;
	}

HandleServiceImpl类增加代码
@Override
	public Map<String, PlayerModel> getAllPlayers() {
		return clubService.getAllPlayers();
	}

启动Tomcat,发布WebService,生成客户端代码

说明: -p :包名 

            -d: 源码的生成路径

            -encoding: 编码格式 我们大部分人使用的都是UTF-8的编码,这里最好设置一下,不然中文就会变乱码

           -client:表示只生成webservice的客户端调用代码, 最后的就是wsdl文件的路径了

            关于这个wsdl2java的具体参数,大家可以 -help一下 ,详细的看一下


客户端测试代码:
package com.lzw.springcxf.client;

import java.util.List;

import com.lzw.springcxf.service.ClubModel;
import com.lzw.springcxf.service.Entry;
import com.lzw.springcxf.service.HandleService;
import com.lzw.springcxf.service.PlayerModel;
import com.lzw.springcxf.service.StringPlayer;
import com.lzw.springcxf.service.impl.HandleServiceTest;

public class WSClient {
    
	public static void main(String[] args) {
		
		HandleServiceTest factory = new HandleServiceTest();
		
		HandleService handleService = factory.getHandleServiceImplPort();
		
		System.out.println(handleService.sayName("内马尔"));
		ClubModel clubModel = new ClubModel();
		clubModel.setClubId(1111);
		clubModel.setClubName("巴塞罗那");
		clubModel.setCountry("西班牙");
		System.out.println("============================");
		List<PlayerModel> players = handleService.getPlayerByClub(clubModel);
		for (PlayerModel play:players) {
			System.out.println(play.getPlayerName());
		}
		System.out.println("============================");
		StringPlayer allPlayer = handleService.getAllPlayers();
		for (Entry entry:allPlayer.getEntries()) {
	        System.out.println(entry.getKey() + entry.getValue().getPlayerName());
	    }
	}
}

控制台显示
本次西班牙国家德比的最佳球员是:内马尔
============================
梅西
内马尔
============================
第4位球员是:贝尔
第3位球员是:C罗
第1位球员是:梅西
第2位球员是:内马尔


  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值