您的位置:首页 > 编程语言 > Java开发

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

2013-11-06 10:59 627 查看
一: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位球员是:内马尔
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐