1、对方webservice接口
wsdl: http://ip:port/services/BusinessObject
namespace: http://businessobject.webservice.legion/
接口方法:update(String loginId,i nt bosid, BusinessobjectDto businessobjectDto);
2、采用调用webservice接口的方法
1)、原先准备采用直接AXIS调用远程的web service,后来发现接口方法中的update第三个参数BusinessobjectDto,为一个类对象,一直传递不成功,后面放弃了该方法;
2)、后面准备采用直接SOAP调用远程的webservice,也是各种传值过去后,报错,应该是update第三个参数BusinessobjectDto的问题;
3)、最后只好采用了使用wsdl2java把WSDL文件转成本地类,然后像本地类一样使用;
3、使用wsdl2java把WSDL文件转成本地类,然后像本地类一样使用
1)、生成本地类
下载apache-cxf-3.1.4,运行bin目录下wsdl2java,命令如下:
wsdl2java -encoding utf-8 -d C:/webservice/src http://ip:port/services/BusinessObject?wsdl
C:/webservice/src为生成的本地类存放目录,utf-8为生成本地类的编码格式
2)、将生成的本地类包直接放在项目代码中,像本地类一样访问;
String webserviceIpPort = "xx.xx.xx.xx: port";
URL url = null;
try {
url = new URL("http://" +webserviceIpPort + "/services/BusinessObject?wsdl");
} catch (MalformedURLException e) {
java.util.logging.Logger.getLogger(BusinessobjectServiceImpService.class.getName())
.log(java.util.logging.Level.INFO,
"Can not initialize the default wsdl from {0}", "http://ip:port/services/BusinessObject?wsdl");
}
BusinessobjectServiceImpService bsi = new BusinessobjectServiceImpService(url);
BusinessobjectService bs = bsi.getBusinessobjectServiceImpPort();
/* 参数赋值 ... */
ResultDto result = bs.update(loginId,bosid, bbd);
在eclipse中运行项目,测试了一下,运行一遍就调用成功了。
4、部署weblogic上调用webservice接口问题
weblogic版本:WebLogic Server 12.1.3.0.0
java版本:java version "1.7.0_55"
开发好后,打成war包部署到weblogic上后,调用webservice接口,一直报错, 错误如下:
java.lang.ClassCastException: weblogic.wsee.jaxws.spi.WLSProvider cannot be cast to javax.xml.ws.spi.Provider
at javax.xml.ws.spi.Provider.provider(Provider.java:43)
at javax.xml.ws.Service.<init>(Service.java:35)
at legion.webservice.businessobject.BusinessobjectServiceImpService.<init>(BusinessobjectServiceImpService.java:41)
at com.xxxxx.cust.server.GfjjCommonService.oAWebserviceApi(GfjjCommonService.java:514)
at com.xxxxx.cust.server.GfjjCommonService$$FastClassBySpringCGLIB$$35a646d0.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at com.xxxx.cust.server.GfjjCommonService$$EnhancerBySpringCGLIB$$162c909a.oAWebserviceApi(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.xxxxxx.gui.data.server.command.executer.CommandExecutor.execute(CommandExecutor.java:136)
at com.xxxxxx.gui.data.server.GUIGWTServer.updateData(GUIGWTServer.java:1888)
at com.xxxxxx.gui.data.server.GUIGWTServer.updateData(GUIGWTServer.java:1)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:751)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:844)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:346)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
at com.xxxxx.gal.web.filter.LoggerContextFilter.doFilter(l:211)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3436)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2285)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2201)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1572)
at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:255)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)
后来百度了下,发现weblogic本身就有一套webservice实现,故这个报错应该是两套调webservice接口方法冲突了。
最后的解决办法:
1、修改服务器的weblogic,删除/opt/bea/wlserver_12.13/oracle_common/modules目录下
com.oracle.webservices.wls.wls-soap-stack-impl_12.1.3.jar包的weblogic/wsee/jaxws/spi/WLSProvider.class文件;
2、将调用webservice接口的jar包放到war包的WEB-INF/lib目录下,所需最简jar包有:
cxf-core-3.0.4.jar
cxf-rt-bindings-soap-3.0.4.jar
cxf-rt-databinding-jaxb-3.0.4.jar
cxf-rt-frontend-jaxws-3.0.4.jar
cxf-rt-frontend-simple-3.0.4.jar
cxf-rt-transports-http-3.0.4.jar
cxf-rt-transports-udp-3.0.4.jar
cxf-rt-ws-addr-3.0.4.jar
cxf-rt-wsdl-3.0.4.jar
cxf-rt-ws-policy-3.0.4.jar
cxf-rt-wsdl-3.0.4.jar
neethi-3.0.3.jar
slf4j-api-1.7.9.jar
xmlschema-core-2.2.1.jar
3、这样修改后,weblogic启动会报两个WLSProvider类有关的错,不过不影响项目启动与运行;