文档章节

CXF 学习(1,使用内置的jetty服务器发布服务。2,CXF与spring集成)

s
 sannywang
发布于 2016/08/19 14:19
字数 1052
阅读 504
收藏 1

cxf为什么会用到jetty系列的jar包,jetty是cxf的内置服务器,下面这种方式就是使用的jetty

经过测试使用的最基本的jar包为:

cxf-2.6.0.jar
jetty-continuation-8.1.15.v20140411.jar
jetty-http-8.1.15.v20140411.jar
jetty-io-8.1.15.v20140411.jar
jetty-server-8.1.15.v20140411.jar
jetty-util-8.1.15.v20140411.jar
neethi-3.0.2.jar
wsdl4j-1.6.2.jar
xmlschema-core-2.0.2.jar
package ws.client;

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

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import ws.service.HelloWorld;
import ws.service.model.User;

public class HelloWorldClient {
	public static void main(String[] args){
		JaxWsProxyFactoryBean svr=new JaxWsProxyFactoryBean();
		String addr="http://localhost:8080/webservice/helloWorld";
		svr.setAddress(addr);
		svr.setServiceClass(HelloWorld.class);
		HelloWorld service=(HelloWorld) svr.create();
		String text=service.sayHi("hello you are very good!");
		System.out.println(text);
		User user=new User();
		user.setName("user1");
		text=service.sayHiToUser(user);
		System.out.println(text);
		User user2=new User();
		user2.setName("user2");
		List<User> users=new ArrayList<>();
		users.add(user);
		users.add(user2);
		String texts[]=service.sayHiToUsers(users);
		System.out.println(texts[0]+texts[1]);
	}
}
package ws.service.app;

import javax.xml.ws.Endpoint;


import ws.service.impl.HelloWorldImpl;

public class HelloWorldApp {
	public static void main(String[] args){
		System.out.println("hello world service start");
		HelloWorldImpl implementor=new HelloWorldImpl();
		String addr="http://localhost:8080/webservice/helloWorld";
		Endpoint.publish(addr, implementor);
		System.out.println("hello world service started");
	}
}
package ws.service;

import java.util.List;

import javax.jws.WebParam;
import javax.jws.WebService;

import ws.service.model.User;

@WebService
public interface HelloWorld {
	public String sayHi(@WebParam(name="text")String text);
	public String sayHiToUser(User user);
	public String[] sayHiToUsers(List<User> users);
}
package ws.service.impl;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.jws.WebParam;
import javax.jws.WebService;

import ws.service.HelloWorld;
import ws.service.model.User;

@WebService(endpointInterface="ws.service.HelloWorld",serviceName="helloWorld")
public class HelloWorldImpl implements HelloWorld{

	private Map<Integer, User> userMap=new LinkedHashMap<Integer, User>();
	
	@Override
	public String sayHi(@WebParam(name = "text") String text) {
		return text;
	}

	@Override
	public String sayHiToUser(User user) {
		return user.getName();
	}

	@Override
	public String[] sayHiToUsers(List<User> users) {
		String[] names=new String[users.size()];
		int index=0;
		for(User user:users){
			userMap.put(index, user);
			names[index]=user.getName();
			index++;
		}
		return names;
	}

}
package ws.service.model;

public class User {
	private String name;

	/**
	 * @return name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name 要设置的 name
	 */
	public void setName(String name) {
		this.name = name;
	}
	
}

注意:服务接口不能有重载方法,因为CXF不支持有重载方法的接口。不然会报以下异常:

Exception in thread "main" javax.xml.ws.WebServiceException: java.lang.IllegalArgumentException: An operation with name [{http://app.service.ws/}sayHiToUser] already exists in this service
	at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:357)
	at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:246)
	at org.apache.cxf.jaxws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:151)
	at javax.xml.ws.Endpoint.publish(Endpoint.java:240)
	at ws.service.app.test.HelloWorldService.main(HelloWorldService.java:12)

2:spring集成CXF。

引入jar包的时候,spring的jar包版本在4.2.x以上的话,CXF的jar包版本要在3.0.x以上才行不然会报错:

java.lang.NoSuchMethodError: org.springframework.aop.support.AopUtils.isCglibProxyClass(Ljava/lang/Class;)Z

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'helloWorld': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.springframework.aop.support.AopUtils.isCglibProxyClass(Ljava/lang/Class;)Z
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    .....
    .....
Caused by: java.lang.NoSuchMethodError: org.springframework.aop.support.AopUtils.isCglibProxyClass(Ljava/lang/Class;)Z
	at org.apache.cxf.common.util.SpringAopClassHelper.getRealClassInternal(SpringAopClassHelper.java:85)
	at org.apache.cxf.common.util.ClassHelper.getRealClass(ClassHelper.java:55)

必须引入的jar包有:

aopalliance-1.0.jar
commons-logging-1.2.jar
cxf-2.6.0.jar
jaxb-api-2.2.jar
jaxb-impl-2.2.5.jar
jetty-continuation-8.1.15.v20140411.jar
jetty-http-8.1.15.v20140411.jar
jetty-io-8.1.15.v20140411.jar
jetty-server-8.1.15.v20140411.jar
jetty-util-8.1.15.v20140411.jar
neethi-3.0.2.jar
spring-aop-3.1.0.RELEASE.jar
spring-asm-3.1.0.RELEASE.jar
spring-beans-3.1.0.RELEASE.jar
spring-context-3.1.0.RELEASE.jar
spring-context-support-3.1.0.RELEASE.jar
spring-core-3.1.0.RELEASE.jar
spring-expression-3.1.0.RELEASE.jar
spring-web-3.1.0.RELEASE.jar
wsdl4j-1.6.2.jar
xmlschema-core-2.0.2.jar

配置文件:

1 - web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>SpringTest2</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/conf/appContext.xml</param-value>
  </context-param>
  
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/webservice/*</url-pattern>
  </servlet-mapping>
</web-app>

配置文件里面的<context-param>元素的<param-value>的值有两种形式,上面是一种。另一种就是:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:appContext.xml</param-value>
</context-param>

这种classpath形式要求context配置文件在类路径下,即src资源包下。不写classpath就放在WEB-INF文件夹下。

2 - context配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    <jaxws:endpoint id="helloWorldService" implementor="ws.service.app.impl.HelloWorldImpl" address="http://localhost:8081/springtest2/webservice/hello"/>
    
    <bean id="client" class="ws.service.app.HelloWorld" factory-bean="clientFactory" factory-method="create"/>        
    
    <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
        <property name="address" value="http://localhost:8081/springtest2/webservice/hello"></property>
        <property name="serviceClass" value="ws.service.app.HelloWorld"></property>
    </bean>   
</beans>

这个配置文件没什么好说的。

测试类:

package ws.service.app.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import ws.service.app.HelloWorld;

public class HelloWorldTest {
	public static void main(String[] args) {
		ApplicationContext context=new FileSystemXmlApplicationContext("WebContent/WEB-INF/conf/appContext.xml");
		HelloWorld client=(HelloWorld) context.getBean("client");
		String textString=client.sayHi("test success!");
		System.out.println(textString);
	}
}

注意:

FileSystemXMLApplicationContext:是加载WEN-INF文件夹下的资源文件。如上。

ClasspathXMLApplicationContext:是加载src资源包下的资源文件。如下:

这时可以写成:

package ws.service.app.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import ws.service.app.HelloWorld;

public class HelloWorldTest {
	public static void main(String[] args) {
		//ApplicationContext context=new FileSystemXmlApplicationContext("WebContent/WEB-INF/conf/appContext.xml");
		ApplicationContext context=new ClassPathXmlApplicationContext("appContext.xml");
		HelloWorld client=(HelloWorld) context.getBean("client");
		String textString=client.sayHi("test success!");
		System.out.println(textString);
	}
}

这时访问地址:

http://localhost:8081/springtest2/webservice/hello?wsdl

就可以看到wsdl文件,控制台也有输出信息。

 

 

© 著作权归作者所有

s
粉丝 1
博文 67
码字总数 18100
作品 0
闵行
程序员
私信 提问
Web Service 那点事儿(2)—— 使用 CXF 开发 SOAP 服务

选框架犹如选媳妇,选来选去,最后我还是选了“丑媳妇(CXF)”,为什么是它?因为 CXF 是 Apache 旗下的一款非常优秀的 WS 开源框架,具备轻量级的特性,而且能无缝整合到 Spring 中。 其实...

黄勇
2014/07/02
13.7K
45
CXF开发webservice

什么是CXF: Apache CXF = Celtix + Xfire 支持多种协议: SOAP1.1,1.2 XML/HTTP CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构,早期语言使用的WS。 C,c++,C#...

包包大人
2014/04/04
11.8K
0
cxf webservice整合spring

前端建模:CXF 提供了前端建模的概念,允许您使用不同的前端 API 来创建 Web 服务。API 允许您使用简单的工厂 Bean 并通过 JAX-WAS 实现来创建 Web 服务。它还允许您创建动态 Web 服务客户端...

尚浩宇
2015/06/24
202
0
Apache CXF 和 Spring 开发 Web Service 1

正文 为什么使用CXF 本文段摘录自 http://www.ibm.com/developerworks/cn/webservices/ws-pojo-springcxf/index.html Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务...

洋葱94
2015/12/04
273
0
Web Service 那点事儿(4)—— 使用 CXF 开发 REST 服务

现在您已经学会了如何使用 CXF 开发基于 SOAP 的 Web 服务,也领略了 Spring + CXF 这个强大的组合,如果您错过了这精彩的一幕,请回头看看这篇吧: [Web Service 那点事儿(2) —— 使用 ...

黄勇
2014/07/23
22.1K
43

没有更多内容

加载失败,请刷新页面

加载更多

DRF 获取DefaultRouter 对应的url

命令 python manage.py show_urls urls.py from user.router import core_routerurlpatterns = [ path('user/login/', views.LoginView.as_view(), name='login'), path('user/log......

hyhlinux
40分钟前
3
0
uniapp登录流程详解uni.login

uni.login(OBJECT) 登录 H5平台登陆注意事项: 微信内嵌浏览器运行H5版时,可通过js sdk实现微信登陆,需要引入一个单独的js,详见 普通浏览器上实现微信登陆,并非开放API,需要向微信申请,...

达达前端小酒馆
40分钟前
3
0
目标检测中 yolo 的mAP是什么含义?

mAP定义及相关概念 P => precision,即 准确率 R => recall,即 召回率 PR曲线 = >即 以 precision 和 recall 作为 纵、横轴坐标 的二维曲线。一般来说,precision 和 recall 是 鱼与熊掌 的...

小松1
44分钟前
4
0
用jdk1.8的断言来做非空判断

Assert.notNull(user, "没有获得登录用户信息"); 看源码如下: public static void notNull(Object object, String message) { if (object == null) { throw new IllegalArgum......

architect刘源源
48分钟前
6
0
2018NOIP各省一等奖分数线

提高组 普及组

SamXIAO
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部