在springmvc中继承cxf 利用cxf发布webService接口以及调用cxf接口
分两步:
第一步:服务端的发布;
分两步:
第一步:服务端的发布;
1:配置web.xml文件,添加cxf的servlet
<servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/webService/*</url-pattern> </servlet-mapping>
2:maven导入需要的cxf jar包<properties> <cxf.version>3.2.1</cxf.version> </properties> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-core</artifactId> <version>${cxf.version}</version> </dependency>
3.导入wsdljar包
<dependency> <groupId>soap.public</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.3</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/wsdl4j-1.6.3.jar</systemPath> </dependency>
此处注意wsdljar包的版本号要是1.6的,之前本地有1.5的导致客户端调用时会报错,所以此处要格外注意。
我此处是将
wsdl4j-1.6.3.jar 包放在了工程的lib目录下,然后引用了本地lib中的此jar包,此处也可以直接从maven仓库中引用。
2:在spring配置文件中发布webService接口(这步可以在写好服务端接口后再配置,此处为了将配置文件放一起)
3:建立服务端代码
定义接口文件HelloWorld.java
@WebService @SOAPBinding(style = SOAPBinding.Style.RPC) public interface HelloWorld { public String uploadICDFile(@WebParam(name = "key")String key, @WebParam(name = "id")String id, @WebParam(name = "type")Integer type); }
定义接口实现类HelloWorldImpl.java
import net.sf.json.JSONObject; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.slf4j.LoggerFactory; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; @WebService( endpointInterface = "com.xacf.syzy.shiYanzypz.web.controller.HelloWorld", targetNamespace = "http://controller.web.shiYanzypz.syzy.xacf.com/", serviceName = "HelloWorld") @SOAPBinding(style = SOAPBinding.Style.RPC) public class HelloWorldImpl implements HelloWorld{ org.slf4j.Logger logger = LoggerFactory.getLogger(HelloWorldImpl.class); @Override public String uploadICDFile(String key, String id, Integer type) { JSONObject result = new JSONObject(); logger.info("进入上传文件接口uploadICDFile,其中整形值yyj="+ICDType); JSONObject resultInfo = new JSONObject(); resultInfo.put("state", "true"); resultInfo.put("message", "验证成功"); resultInfo.put("errorCode", "0"); result.put("resultInfo", resultInfo); System.out.println(key + "................." + result.toString()); return result.toString(); } }
到此服务端已建立完成,访问地址:http://127.0.0.1:8081/工程名/webService/helloWorld?wsdl即可看到发布的webService接口内容。
第二步:客户端调用:
客户端调用方法:
/** * 调用webservice 服务端,上传ICD文件 * @param wsdUrl webservice 服务地址 例如:http://127.0.0.1:8081/工程名/webService/helloWorld?wsdl * @param namespace 域名 例如:http://controller.web.webservice.cficd.xacf.com/ * @param methodName 方法名 webService 方法名 * @param obj 参数对象数组 按照方法中的参数顺序依次传入,且必须与参数的类型一致 * @return 返回接口调用结果信息 * @throws Exception */ public static String callWebServiceByJaxWs(String wsdUrl, String namespace, String methodName,Object[] obj) throws Exception{ String result = ""; JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); org.apache.cxf.endpoint.Client client = dcf.createClient(wsdUrl);//wsdUrl为调用webService的wsdl地址 QName name = new QName(namespace, methodName); //namespace是命名空间,methodName是方法名 try { Object[] ss = client.invoke(name, obj); System.out.println(ss[0]); } catch (Exception e) { e.printStackTrace(); } return result; }
业务action中调用上面封装好的方法即可,注意参数类型要对应,否则会报异常:调用例子如下:
String ="http://127.0.0.1:8082/工程名/webService/helloWorld?wsdl"; String webSoap = "http://controller.web.shiYanzypz.syzy.xacf.com/"; Object[] paramValue = new Object[]{"qe","ssf",1}; String result= WebServiceUtil.callWebServiceByJaxWs(webUrl,webSoap,"uploadICDFile",paramValue);
转载请标明出处:springmvc集成cxf
文章来源: springmvc集成cxf