今天在学习WebService的时候用到@WebService注解,但是总是报错。因为没有这个包。搞了半个小时,终于解决了。
因为用的是java 10,因为java 9开始加入模块的概念。在java9/10中并没有javax.jws包。
最后还是安了个java8了终于搞好了,maven添加依赖的的形式,高了好久没有搞出来,实在是不推荐。
CXF解决Map等复杂类型
maven依赖:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.1.5</version>
</dependency>
简单接口:
@WebService
public interface HelloWorld {
public Map<String,List<Role>> getRoles();
}
实现:
@WebService
public class HelloWorldImpl implements HelloWorld{
@XmlJavaTypeAdapter(MyAdapter.class);//xmljava类型适配器,自定义MyAdapter类
public Map<String, List<Role>> getRoles() {
Map<String,List<Role>> roleMap=new HashMap<String,List<Role>>();
List<Role> roleList=new ArrayList<Role>();
roleList.add(new Role(1,"项目经理"));
roleList.add(new Role(2,"程序员"));
roleMap.put("yefan", roleList);
List<Role> roleList2=new ArrayList<Role>();
roleList2.add(new Role(3,"销售经理"));
roleList2.add(new Role(4,"需求分析师"));
roleMap.put("jack", roleList2);
return roleMap;
}
}
自定义适配器:
public class MyAdapter extends XmlAdapter<MyMap[], Map<String ,List<Role>>>{//Map类型,通过对象数组实现转换
@Override
public Map<String, List<Role>> unmarshal(MyMap[] v) throws Exception {
Map<String,List<Role>> map=new HashMap<String,List<Role>>();
for(int i=0;i<v.length;i++) {
map.put(v[i].getKey(), v[i].getValue());
}
return map;
}
@Override
public MyMap[] marshal(Map<String, List<Role>> v) throws Exception {
MyMap[] myMap=new MyMap[v.size()];
int i=0;
for(String key:v.keySet()) {
myMap[i]=new MyMap();
myMap[i].setKey(key);
myMap[i].setValue(v.get(key));
i++;
}
return myMap;
}
}
自定义实现类:
public class MyMap {
private String key;
private List<Role> value;
·····setter·getter······
}
主方法:
public static void main(String[] args) {
System.out.println("start");
HelloWorld implementor=new HelloWorldImpl();
String address="http://192.168.77.1:8120/helloWorld";
JaxWsServerFactoryBean jaxWsServerFactoryBean=new JaxWsServerFactoryBean();//通过他暴露接口与定义接口及实现
jaxWsServerFactoryBean.setAddress(address);
jaxWsServerFactoryBean.setServiceBean(implementor);
jaxWsServerFactoryBean.setServiceClass(HelloWorld.class);
jaxWsServerFactoryBean.create();
System.out.println("started");
}
开发客户端
使用wsdl2java 工具
(1)在http://cxf.apache.org/download.html下载工具包,解压到自定义路径。修改环境变量Path,添加其中bin文件夹的目录地址。
(2)在eclipse中新建maven项目 WS_client,添加依赖
(3)cmd进入上一步项目工作空间
(4)使用指令 wsdl2java http://198.168.77.1:8120/helloWorld?wsdl
他会自动帮你解析wsdl,生成java文件
(5)测试
public static void main(String[] args) {
HelloWorldService hws=new HelloWorldService();
HelloWorld helloWorld=hws.getHelloWorldPort();
MyMapArray myMapArray=helloWorld.getRoles();
for(MyMap m:myMapArray.item) {
System.out.println(m.key);
for(Role r:m.value) {
System.out.println(r.getRoleName());
}
}
}
结果:
jack
销售经理
需求分析师
yefan
项目经理
程序员