处理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类:
ClubService接口增加代码
HandleService接口增加代码
ClubServiceImpl类增加代码
HandleServiceImpl类增加代码
启动Tomcat,发布WebService,生成客户端代码
说明: -p :包名
-d: 源码的生成路径
-encoding: 编码格式 我们大部分人使用的都是UTF-8的编码,这里最好设置一下,不然中文就会变乱码
-client:表示只生成webservice的客户端调用代码, 最后的就是wsdl文件的路径了
关于这个wsdl2java的具体参数,大家可以 -help一下 ,详细的看一下
客户端测试代码:
控制台显示
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位球员是:内马尔
相关文章推荐
- 9.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:服务端发布成功
- 10.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:客户端执行wsdl2java
- 2.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:服务器实现类
- 3.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:服务端业务逻辑层接口
- 4.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:服务端业务逻辑层实现类
- 5.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:服务端domain
- 6.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:服务端发布
- 11.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:客户端主类
- 7.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:转换器1
- 1.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:服务器接口
- 8.当形参,返回值类型不是JavaBean式的复合类,Map时,CXF无法处理:转换器2
- CXF学习04---处理MAP等CXF无法自动转换的复合数据类型的形参和返回值
- 【WebService框架-CXF】——CXF对Map等无法自动转化的类型的处理
- webservice学习之处理Map等CXF无法自动转化的类型
- webservice学习之处理Map等CXF无法自动转化的类型
- Map等CXF无法自动转换的复合数据类型的形参和返回值的处理
- webservice学习之处理Map等CXF无法自动转化的类型
- webservice学习之处理Map等CXF无法自动转化的类型
- CXF-05:使用CXF处理返回值的类型为Map、非JavaBean式的复合类
- 使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值