webservice传值list<map>



第一点:list<map>传值,报错:map为接口,不是jawx的………………

所以要这样list<HashMap>或者自己继承hashmap;


上代码:第一步建立适配器,不要问怎么弄的,百度学的

package com.ailk.esb.work;

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

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

public class MapAdapter extends XmlAdapter<MapConvertor, Map<String, Object>> {

	@Override
	public MapConvertor marshal(Map<String, Object> map) throws Exception {
		MapConvertor convertor = new MapConvertor();
		for(Map.Entry<String, Object> entry:map.entrySet()){
			MapConvertor.MapEntry e = new MapConvertor.MapEntry(entry);
			convertor.addEntry(e);
		}
		return convertor;
	}

	@Override
	public Map<String, Object> unmarshal(MapConvertor map) throws Exception {
		Map<String, Object> result = new HashMap<String,Object>();
		for(MapConvertor.MapEntry e :map.getEntries()){
			result.put(e.getKey(), e.getValue());
		}
		return result;
	}

}
package com.ailk.esb.work;

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

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlType;

@XmlType(name = "MapConvertor")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
//@XmlSeeAlso({User.class})//如果传递的是List<Map<String,User>>,必须要@XmlSeeAlso注解
public class MapConvertor {

	private List<MapEntry> entries = new ArrayList<MapEntry>();

	public void addEntry(MapEntry entry) {
		entries.add(entry);
	}

	public static class MapEntry {
		public MapEntry() {
			super();
		}

		public MapEntry(Map.Entry<String, Object> entry) {
			super();
			this.key = entry.getKey();
			this.value = entry.getValue();
		}

		public MapEntry(String key, Object value) {
			super();
			this.key = key;
			this.value = value;
		}

		private String key;
		private Object value;

		public String getKey() {
			return key;
		}

		public void setKey(String key) {
			this.key = key;
		}

		public Object getValue() {
			return value;
		}

		public void setValue(Object value) {
			this.value = value;
		}
	}

	public List<MapEntry> getEntries() {
		return entries;
	}
}
第二步:我自己实现了hashmap  命名问IMap,方法都一样,也可以直接是hashmap

然后写出接口:只看test方法哦,getreporteoms是javabean的

package com.ailk.esb.work.service;

import java.util.List;

import javax.jws.WebService;

import com.ailk.esb.work.mode.ReportBean;
import com.ailk.utils.IMap;

@WebService(name = "IEomReportESBSrv", targetNamespace = "http://ailk.eom.com")

public interface EomReportESBSrv {
	/**
	 * 获取实时查询集合
	 * 
	 * @param @WebParam(name = "param") 
	 */
	//@WebParam(name = "index") int index
	public List<ReportBean> getReportEoms(String areaName,String timeInterval);

	List<IMap> test(String areaName, String timeInterval);
	
}

实现类:

package com.ailk.esb.work.service.impl;

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

import javax.annotation.Resource;
import javax.jws.WebService;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import org.apache.log4j.Logger;

import com.ailk.esb.work.MapAdapter;
import com.ailk.esb.work.dao.PimReportMapper;
import com.ailk.esb.work.mode.ReportBean;
import com.ailk.esb.work.service.EomReportESBSrv;
import com.ailk.om.dao.PimWorkInstMapper;
import com.ailk.utils.IMap;


/**
 * 
 * @param portName		    wsdl文档:默认是"类名+ServicePort" <wsdl:port name = "" binding="tns:XXXSoapBinding"> 
 * @param serviceName       wsdl文档:<wsdl:service name = "">
 * @param targetNamespace   命名空间,对应tns的定义.默认是“http://”+包(package)反过来写
 * @param endpointInterface 要暴露的接口类。指定Interface全名,包括包名
 * 
 * @author Yuang
 */
@WebService(serviceName = "IEomReportESBSrv", portName = "IEomReprotESBSrvPort", 
endpointInterface = "com.ailk.esb.work.service.EomReportESBSrv",targetNamespace="http://ailk.eom.com")
/*	地市			是			入参	全省默认为80223
	时间间隔(秒)	是			入参	系统时间-时间间隔
	网元ID					出参					出参为集合
	影响设备ID					出参	
	网元类型					出参	
	工单状态	未完工|已完工		出参	
	工单号						出参	*/

public class EomReportESBSrvImpl implements EomReportESBSrv {
	@Resource
	private PimWorkInstMapper pimWorkInstMapper;
	
	@Resource
	private PimReportMapper pimReportMapper;
	
	private Logger logger = Logger.getLogger(this.getClass()); 
	@Override
	public List<ReportBean> getReportEoms(String areaName, String timeInterval) {
		logger.fatal("报表初始化接口areaName:"+areaName+"-------timeInterval:"+timeInterval);
		String message = "";
		//List<IMap> list = new ArrayList<IMap>();
		List<ReportBean> list = new ArrayList<ReportBean>();
		IMap map = new IMap();
		if(areaName != null && timeInterval != null){
			long time =  (new Date()).getTime();
			Date preTime = new Date(time-Long.parseLong(timeInterval));
			areaName = areaName.equals("80223") ? "" : areaName ;
			map.put("endTime", new Date());
			map.put("startTime", preTime);
			map.put("areaName", areaName);
			//list = pimWorkInstMapper.getReportDataList(map);
			list = pimReportMapper.getReportDataList(map);
		}else{
			message = "传入值为空";
		}
		map.put("message",message);
		//list.add(map);
		
		return  list;
	}
	@Override
	@XmlJavaTypeAdapter(MapAdapter.class)
	public List<IMap> test(String areaName, String timeInterval) {
		logger.fatal("报表初始化接口areaName:"+areaName+"-------timeInterval:"+timeInterval);
		String message = "";
		List<IMap> list = new ArrayList<IMap>();
		//List<ReportBean> list = new ArrayList<ReportBean>();
		IMap map = new IMap();
		if(areaName != null && timeInterval != null){
			long time =  (new Date()).getTime();
			Date preTime = new Date(time-Long.parseLong(timeInterval));
			areaName = areaName.equals("80223") ? "" : areaName ;
			map.put("endTime", new Date());
			map.put("startTime", preTime);
			map.put("areaName", areaName);
			list = pimWorkInstMapper.getReportDataList(map);
			//list = pimReportMapper.getReportDataList(map);
		}else{
			message = "传入值为空";
		}
		map.put("message",message);
		//list.add(map);
		
		return  list;
	}

}


好了,我们成功了!
客户端测试代码:

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		IEomReportESBSrv_Service service = new IEomReportESBSrv_Service();
		IEomReportESBSrv servicePort = service.getIEomReprotESBSrvPort();
		System.out.println(servicePort);
		List<IMap> list = servicePort.test("80340", "1472471343922");
		System.out.println(list.size());}


结果:

JAX-WS RI 2.2.4-b01: Stub for http://localhost:8080/eom/esb/reportWork
com.eom.ailk.IMap@2fe2622b


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我的jdk版本是11,用了这些jar包:" <dependency> <groupId>com.sun.xml.messaging.saaj</groupId> <artifactId>saaj-impl</artifactId> <version>3.0.2</version> </dependency> <!-- https://mvnrepository.com/artifact/jakarta.xml.ws/jakarta.xml.ws-api --> <dependency> <groupId>jakarta.xml.ws</groupId> <artifactId>jakarta.xml.ws-api</artifactId> <version>4.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-rt --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>4.0.1</version> </dependency> <!-- https://mvnrepository.com/artifact/jakarta.xml.soap/jakarta.xml.soap-api --> <dependency> <groupId>jakarta.xml.soap</groupId> <artifactId>jakarta.xml.soap-api</artifactId> <version>3.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/jakarta.activation/jakarta.activation-api --> <dependency> <groupId>jakarta.activation</groupId> <artifactId>jakarta.activation-api</artifactId> <version>2.1.2</version> </dependency> ";但是在tomcat中运行这里的代码" private static MessageFactory getSOAPMsgFactory() throws SOAPException { if (_msgFact == null) { _msgFact = MessageFactory.newInstance(); } return _msgFact; }",会抛出异常:"jakarta.xml.soap.SOAPException: Unable to create message factory for SOAP: Unable to create SAAJ meta-factory: Provider com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl not found at jakarta.xml.soap.MessageFactory.newInstance(MessageFactory.java:96) at com.firstronix.webservice.WebServiceUtils.getSOAPMsgFactory(WebServiceUtils.java:80) at com.firstronix.webservice.WebServiceUtils.newBlankSOAPMessage(WebServiceUtils.java:130)",我该如何修复这个bug
06-08

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值