一:CXF形参、返回值
1:当形参和返回值的类型是String、基本数据类型是,CXF肯定可以轻松处理
2:当形参和返回值的类型是javabean式的复合类(就是普通的POJO实体类)、List集合、数组等复杂类型时, CXF也可以很好处理。
3:还有一些像Map、非javabean式的复合类,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类:
ClubService接口增加代码
HandleService接口增加代码
ClubServiceImpl类增加代码
HandleServiceImpl类增加代码
启动Tomcat,发布WebService,生成客户端代码
控制台显示
二:步骤如下
1: 使用注解 @XmlJavaTypeAdapter(java自身的注解,可在jdkAPI文档中查到)修饰CXF无法自动处理的类型,使用该Annotation时,
通过value属性指定一个转换器(自己定义)。@XmlJavaTypeAdapter (value="FKXmlAdapter.class")
2: 实现自己定义的转化器,实现转化器时,需要开发一个CXF能够处理的类型。
三:代码
通过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位球员是:内马尔