加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService基础课程之使用CXF发布javase服务

发布时间:2020-12-16 21:51:19 所属栏目:安全 来源:网络整理
导读:1:使用ServerFactoryBean发布服务: ??使用CXF发布一个服务,与JDK6发布一个服务完全不同 ??* 即使是不使用@WebService注解,一样可以发布成功 ??* 即使此类没有对外公布的方法一样可以发布成功 代码示例: package cn.itcast.ws;import org.apache.cxf.fro
1:使用ServerFactoryBean发布服务:
??使用CXF发布一个服务,与JDK6发布一个服务完全不同
??* 即使是不使用@WebService注解,一样可以发布成功
??* 即使此类没有对外公布的方法一样可以发布成功

代码示例:
package cn.itcast.ws;

import org.apache.cxf.frontend.ServerFactoryBean;

public class HiServiceImpl1 {
	public String sayHi(String name) {
		return "hi: "  + name;
	}
	
	public static void main(String[] args) {
		//声明实例
		ServerFactoryBean bean = new ServerFactoryBean();
		//绑定到发布地址的端口
		bean.setAddress("http://localhost:8888/hi");
		//设置服务接口,若没有,则为本类?
		bean.setServiceClass(HiServiceImpl1.class);
		//设置接口实现类,即服务类
		bean.setServiceBean(new HiServiceImpl1());
		//发布服务
		bean.create();
		System.out.println("发布成功");
	}
}



2:使用JaxWsServerFactoryBean发布服务:
?????*JaxWsServerFactoryBean是ServerFactoryBean的子类,也是功能扩展类。
???? *?此类,必须要在被发布为服务的类上添加@WebService注解,如果不加注解,虽然不出错,但也不会对外暴露任何方法
???? *?使用此类生成的wsdl文件更加规范。

代码示例:
package cn.itcast.ws;

import javax.jws.WebService;

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
@WebService
public class HiServiceImpl2 {
	public String sayHi(String name) {
		return "hi: "  + name;
	}
	
	public static void main(String[] args) {
		JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
		//绑定到发布地址的端口
		bean.setAddress("http://localhost:8888/hi");
		//设置服务接口,若没有,则为本类?
		bean.setServiceClass(HiServiceImpl2.class);
		//设置接口实现类,即服务类
		bean.setServiceBean(new HiServiceImpl2());
		//发布服务
		bean.create();
		System.out.println("发布成功");
	}
}

附,使用接口和及其实现类来发布WebService服务
? 接口类:
package cn.itcast.ws;

import javax.jws.WebService;

@WebService
public interface HiService {
	public String sayHi(String name);
}
? 实现类:
package cn.itcast.ws;

public class HiServiceImpl implements HiService{
	
	public String sayHi(String name) {
		return "hi: "  + name;
	}
	
}
? 服务发布类:
package cn.itcast.ws;

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

public class Server {
	public static void main(String[] args) {
		JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
		//绑定到发布地址的端口
		bean.setAddress("http://localhost:8888/hi");
		//设置服务接口,若没有,则为本类?
		bean.setServiceClass(HiService.class);
		//设置接口实现类,即服务类
		bean.setServiceBean(new HiServiceImpl());
		//发布服务
		bean.create();
		System.out.println("发布成功");
	}
}

使用ClientProxyFactoryBean客户端调用:
package cn.itcast.ws;

import org.apache.cxf.frontend.ClientProxyFactoryBean;
/**
 * 1.使用ServerFactoryBean发布服务以后,在没有接口的情况下,
 * 可以使用wsimport生成的客户端代码调用成功。
 * 
 * 2.但如果要使用ClientProxyFactoryBean客户端去调用服务器,则必须要先在服务器端创建一个接口。
 * (一直以来,Spring都要求面向接口编程,而cxf与Spring能很好的整合,也就在此。),
 * 所以,必须要重写服务器端的代码。这将导致刚才使用wsimport生成的调用代码失效。
 * 
 * 3.如果在其他项目中调用,仍然需wsimport生成的类,但只需要一个接口。
 * @author pengdi
 *
 */
public class Client {
	public static void main(String[] args) {
		//创建客户端类
		ClientProxyFactoryBean bean = new ClientProxyFactoryBean();
		//设置访问地址
		bean.setAddress("http://localhost:8888/hi");
		/*
		 * 1.若服务接口在同一项目中,直接使用本项目中的接口类HiService
		 * 2.若在不同项目中调用,则类HiService是用wsimport生成且修改过的
		 */
		bean.setServiceClass(HiService.class);
		//通过create方法返回接口实例
		HiService hs = (HiService)bean.create();
		String str = hs.sayHi("hahah");
		System.out.println(str);
	}
}
上述服务发布类都能够成功执行发布,但是最后使用 ClientProxyFactoryBean客户端调用时报如下错误:

四月 25,2017 10:52:15 下午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean checkServiceClassAnnotations
警告: A JAX-WS Annotation was found on cn.itcast.ws.HiService while using the Simple frontend.? For better results,use the JAX-WS frontend.
四月 25,2017 10:52:15 下午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http://ws.itcast.cn/}HiService from class cn.itcast.ws.HiService
Exception in thread "main" org.apache.cxf.binding.soap.SoapFault: Unmarshalling Error: 意外的元素 (uri:"http://ws.itcast.cn/",local:"arg0")。所需元素为<{}name>
?at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:86)
?at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:52)
?at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:41)
?at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
?at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:112)
?at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
?at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
?at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
?at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:801)
?at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1680)
?at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1559)
?at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1356)
?at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
?at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:653)
?at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
?at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
?at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514)
?at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423)
?at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:324)
?at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:277)
?at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
?at org.apache.cxf.frontend.ClientProxy.invoke(ClientProxy.java:81)
?at com.sun.proxy.$Proxy24.sayHi(Unknown Source)
?at cn.itcast.ws.Client.main(Client.java:29)

很是不解,希望看到的各位也能看看,明个再找找解决方案吧。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读