webservice客户端在weblogic中间件下失效问题

背景描述:公司产品开发环境为eclipse+tomcat,所以开发的webservice接口是在tomcat下测试的,测试没发现问题。但是部署到weblogic下发现接口调不通,报空指针。

处理方法:

1、由于在本地测试没发现问题,并且本地与部署到生产使用的是同一个websrvice接口。于是在生产部署了一套tomcat环境,测试发现没问题,考虑非代码bug问题。

2、网上找了很多解决办法,尝试了一些,都没效果。无奈,只能再次回到代码方面,修改代码开发逻辑,之前采用的是jdk原生模式生成的客户端代码(懒人专用),不会的可以参考我的另一篇文章,https://www.cnblogs.com/jjflover/p/13732368.html。

3、期间修改了两种实现方法,发现还是各种问题,偶然间在一片文章里看到需要修改weblogic加载jar包的顺序,试了一下,竟然成功了,血泪史就此结束。。。。

4、总结,开始报的空指针是由于产品本身的jar包跟weblogic自身的jar包冲突导致,我曾试着分析,但是没找到具体冲突jar包和处理方法。就用了一个简单粗暴的方法,由于本项目jar不需要weblogic的依赖jar,所以找到weblogic.xml。
prefer-web-inf-classes 中true 改为false。

 

5、期间尝试的另外两种实现方法也记录一下

①:此种方法不需要额外导入jar包

 1 package com.fotic.it.support.rpcservice.api.webservice;
 2 
 3 import java.net.MalformedURLException;
 4 import java.net.URL;
 5 import java.text.SimpleDateFormat;
 6 import java.util.Calendar;
 7 import java.util.Date;
 8 import java.util.Iterator;
 9 import java.util.List;
10 import java.util.Map;
11 
12 import javax.xml.namespace.QName;
13 import javax.xml.ws.Service;
14 import javax.xml.ws.soap.SOAPBinding;
15 
16 import org.junit.Test;
17 
18 import com.fotic.it.support.rpcservice.api.webservice.NoticeSendService;
19 
20 public class myTest {
21             static String toMail = "123456@qq.com";
22             static Date date = new Date();
23             static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); 
24             static Calendar c = Calendar.getInstance();
25             static String sendDate = sf.format(date);
26             static String sDate = sendDate;
27             static String eDate = sf.format(c.getTime());
28             static String appId = "1";
29             static String attachInfo = "";
30             static String businessCateGory = "业务分类";
31             static String businessType = "1";
32             static String htmlContent = "您有任务被驳回,请前往系统查看!!!";
33             static String sendRange = "5";
34             static String infoUrl = "''";
35             static Long projectId = (long) 1;
36             static String sendRangValue = "";
37             static String remindLevel = "1";
38             static String roleRangeId = "123456@qq.com";
39             static String secCode = "98765";
40             static String channel = "2";
41             static String sponsornam = "";
42             static String sponsorId = "";
43             static String textContent = "";
44             static String title = "任务提醒";
45     
46     public String sendEmail(String appId2, String attachInfo2, String businessCateGory2, String businessType2,
47             String eDate2, String htmlContent2, String infoUrl2, Long projectId2, String remindLevel2,
48             String roleRangeId2, String sDate2, String secCode2, String channel2, String sendDate2, String sendRange2,
49             String sendRangValue2, String sponsorId2, String sponsornam2, String textContent2, String title2)
50             throws MalformedURLException, ClassNotFoundException {
51         URL url = new URL("http://ip:8651/services/NoticeSendService?wsdl");
52         // 指定命名空间和服务名称
53         QName qName = new QName("http://email.fotic.com", "NoticeSendService");
54         Service service = Service.create(url, qName);
55         System.out.println(service.getPorts());        
56         // 通过getPort方法返回指定接口
57         NoticeSendService myServer = service.getPort(NoticeSendService.class);
58         // 调用方法 获取返回值
59         String result = myServer.executeProcedure(appId2, attachInfo2, businessCateGory2, businessType2, eDate2, htmlContent2,
60                 infoUrl2, projectId2, remindLevel2, roleRangeId2, sDate2, secCode2, channel2, sendDate2, sendRange2,
61                 sendRangValue2, sponsorId2, sponsornam2, textContent2, title2);
62         System.out.println(result);
63         return result;
64     }    
65     public static void main(String[] args) throws MalformedURLException {
66         URL url = new URL("http://ip:8651/services/NoticeSendService?wsdl");
67         // 指定命名空间和服务名称
68         QName qName = new QName("http://email.fotic.com", "NoticeSendService");
69         Service service = Service.create(url, qName);
70         // 通过getPort方法返回指定接口
71         NoticeSendService myServer = service.getPort(new QName("http://email.fotic.com","NoticeSendServiceImplPort"), NoticeSendService.class);
72         // 调用方法 获取返回值
73         String result = myServer.executeProcedure(appId, attachInfo, businessCateGory, businessType, eDate, htmlContent, 
74                 infoUrl, projectId, remindLevel, roleRangeId, sDate, secCode, channel, sendDate, sendRange, 
75                 sendRangValue, sponsorId, sponsornam, textContent, title );
76         System.out.println(result);
77     }
78 }
View Code

②:此种方法采用axis方式,需要额外导入jar包

  1 package com.fotic.it.support.rpcservice.api.webservice;
  2 
  3 import java.net.URL;
  4 import java.text.SimpleDateFormat;
  5 import java.util.Calendar;
  6 import java.util.Date;
  7 import javax.xml.namespace.QName;
  8 import org.apache.axis.client.Call;
  9 import org.apache.axis.client.Service;
 10 import org.apache.axis.encoding.XMLType;
 11 
 12 public class myTest2 {
 13             static String toMail = "123456@qq.com";
 14             static Date date = new Date();
 15             static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); 
 16             static Calendar c = Calendar.getInstance();
 17             static String sendDate = sf.format(date);
 18             static String sDate = sendDate;
 19             static String eDate = sf.format(c.getTime());
 20             static String appId = "1";
 21             static String attachInfo = "";
 22             static String businessCateGory = "业务分类";
 23             static String businessType = "1";
 24             static String htmlContent = "您有任务被驳回,请前往系统查看!!!";
 25             static String sendRange = "5";
 26             static String infoUrl = "''";
 27             static Long projectId = (long) 1;
 28             static String sendRangValue = "";
 29             static String remindLevel = "1";
 30             static String roleRangeId = "123456@qq.com";
 31             static String secCode = "98765";
 32             static String channel = "2";
 33             static String sponsornam = "";
 34             static String sponsorId = "";
 35             static String textContent = "";
 36             static String title = "任务提醒";
 37     
 38     public String sendEmail(String appId2, String attachInfo2, String businessCateGory2, String businessType2, String eDate2, 
 39             String htmlContent2, String infoUrl2, Long projectId2, String remindLevel2, String roleRangeId2, String sDate2, 
 40             String secCode2, String channel2, String sendDate2, String sendRange2, String sendRangValue2, String sponsorId2,
 41             String sponsornam2, String textContent2, String title2) {
 42         System.out.println("0000000");
 43         String url = "http://ip:8651/services/NoticeSendService?wsdl";
 44         org.apache.axis.client.Service service = new Service();
 45         try {
 46             org.apache.axis.client.Call call = (Call) service.createCall();
 47             call.setTargetEndpointAddress(new URL(url));
 48             System.out.println("0");
 49             // WSDL里面描述的接口名称(要调用的方法)
 50             call.setOperationName(new QName("http://email.fotic.com", "executeProcedure"));
 51             System.out.println("1");
 52             //跨平台调用加上这个
 53            call.setUseSOAPAction(true);
 54            System.out.println("2");
 55            //call.setSOAPActionURI("http://ip:8651/services/NoticeSendService");
 56             // 接口方法的参数名, 参数类型,参数模式 IN(输入), OUT(输出) or INOUT(输入输出)
 57             call.addParameter("appId", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 58             call.addParameter("attachInfo", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 59             call.addParameter("businessCateGory", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 60             call.addParameter("businessType", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 61             call.addParameter("eDate", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 62             call.addParameter("htmlContent", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 63             call.addParameter("infoUrl", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 64             call.addParameter("projectId", XMLType.XSD_LONG, javax.xml.rpc.ParameterMode.IN);
 65             call.addParameter("remindLevel", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 66             call.addParameter("roleRangeId", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 67             call.addParameter("sDate", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 68             call.addParameter("secCode", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 69             call.addParameter("channel", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 70             call.addParameter("sendDate", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 71             call.addParameter("sendRange", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 72             call.addParameter("sendRangValue", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 73             call.addParameter("sponsorId", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 74             call.addParameter("sponsornam", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 75             call.addParameter("textContent", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 76             call.addParameter("title", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
 77             // 设置被调用方法的返回值类型
 78             call.setReturnType(XMLType.XSD_STRING);
 79             
 80             //输出SOAP请求报文
 81            // System.out.println("--SOAP Request: " + call.getMessageContext().getRequestMessage().getSOAPPartAsString());
 82             //输出SOAP返回报文
 83            // System.out.println("--SOAP Response: " + call.getResponseMessage().getSOAPPartAsString());
 84             //输出返回信息
 85            // System.out.println("result==="+ret.toString());
 86             
 87             // 设置方法中参数的值
 88             Object result = call.invoke(new Object[] { appId, attachInfo, businessCateGory, businessType, eDate, htmlContent, 
 89                     infoUrl, projectId, remindLevel, roleRangeId, sDate, secCode, channel, sendDate, sendRange, 
 90                     sendRangValue, sponsorId, sponsornam, textContent, title });
 91             System.out.println("4");
 92             System.out.println(result.toString());
 93         } catch (Exception e) {
 94             e.printStackTrace();
 95         }
 96     
 97         return "";
 98     }
 99     
100     public static void main(String[] args) {
101         String url = "http://ip:8651/services/NoticeSendService?wsdl";
102         org.apache.axis.client.Service service = new Service();
103         try {
104             org.apache.axis.client.Call call = (Call) service.createCall();
105             call.setTargetEndpointAddress(new URL(url));
106             System.out.println("0");
107             // WSDL里面描述的接口名称(要调用的方法)
108             call.setOperationName(new QName("http://email.fotic.com", "executeProcedure"));
109             System.out.println("1");
110             //跨平台调用加上这个
111            call.setUseSOAPAction(true);
112            System.out.println("2");
113            //call.setSOAPActionURI("http://10.7.101.40:8651/services/NoticeSendService");
114             // 接口方法的参数名, 参数类型,参数模式 IN(输入), OUT(输出) or INOUT(输入输出)
115             call.addParameter("appId", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
116             call.addParameter("attachInfo", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
117             call.addParameter("businessCateGory", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
118             call.addParameter("businessType", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
119             call.addParameter("eDate", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
120             call.addParameter("htmlContent", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
121             call.addParameter("infoUrl", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
122             call.addParameter("projectId", XMLType.XSD_LONG, javax.xml.rpc.ParameterMode.IN);
123             call.addParameter("remindLevel", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
124             call.addParameter("roleRangeId", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
125             call.addParameter("sDate", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
126             call.addParameter("secCode", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
127             call.addParameter("channel", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
128             call.addParameter("sendDate", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
129             call.addParameter("sendRange", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
130             call.addParameter("sendRangValue", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
131             call.addParameter("sponsorId", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
132             call.addParameter("sponsornam", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
133             call.addParameter("textContent", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
134             call.addParameter("title", XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
135             // 设置被调用方法的返回值类型
136             call.setReturnType(XMLType.XSD_STRING);
137             
138             //输出SOAP请求报文
139            // System.out.println("--SOAP Request: " + call.getMessageContext().getRequestMessage().getSOAPPartAsString());
140             //输出SOAP返回报文
141            // System.out.println("--SOAP Response: " + call.getResponseMessage().getSOAPPartAsString());
142             //输出返回信息
143            // System.out.println("result==="+ret.toString());
144             
145             // 设置方法中参数的值
146             Object result = call.invoke(new Object[] { appId, attachInfo, businessCateGory, businessType, eDate, htmlContent, 
147                     infoUrl, projectId, remindLevel, roleRangeId, sDate, secCode, channel, sendDate, sendRange, 
148                     sendRangValue, sponsorId, sponsornam, textContent, title });
149             System.out.println("4");
150             System.out.println(result.toString());
151         } catch (Exception e) {
152             e.printStackTrace();
153         }
154     }
155     
156 }
View Code

 

posted @ 2021-03-03 10:58  飞&静  阅读(259)  评论(0编辑  收藏  举报