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

CXF构建webservice

发布时间:2020-12-17 00:07:34 所属栏目:安全 来源:网络整理
导读:以下是使用 CXF2.74 的构建过程,其他版本要另作细微修改 首先, CXF 2.74 和 spring 3.2 整合需要准备如下 jar 包文件: 包下载地址: http://cxf.apache.org/download.html 我下载的是 Binary distribution apache-cxf-2.7.4.tar.gz 这五个是服务器端必须

以下是使用CXF2.74的构建过程,其他版本要另作细微修改

首先,CXF2.74spring3.2整合需要准备如下jar包文件:

包下载地址:http://cxf.apache.org/download.html 我下载的是Binary distributionapache-cxf-2.7.4.tar.gz



082925972.png

083027621.png


这五个是服务器端必须的五个,还有Spirng 3.0以上的包,为了避免项目中出现包的版本问题,直接使用spring3.2.1没有使用下载附带的jar

添加jar包后在web.xml中添加如下配置:


<!-- 加载Spring容器配置 -->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<!-- 设置Spring容器加载配置文件路径 -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/applicationContext-server.xml</param-value>

</context-param>

<listener>

<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>

</listener>

<servlet>

<servlet-name>CXFService</servlet-name>

<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>CXFService</servlet-name>

<url-pattern>/*</url-pattern>

</servlet-mapping>



WEB-INF中新建applicationContext-server.xml如下:

其中红色下划线的schema为手动添加内容


<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:jaxws="http://cxf.apache.org/jaxws"xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:context="http://www.springframework.org/schema/context"

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">

</beans>



添加完这个文件后,在文件中导入下面的文件

<import resource="classpath:META-INF/cxf/cxf.xml"/>

文件配置好后下面书写服务器端代码

首先编写服务器端接口


package com.gdie.service;
import javax.jws.WebParam;
import javax.jws.WebService;
import com.gdie.service.entities.User;
@WebService
public interface IComplexUserService {
    public User getUserByName(@WebParam(name="name")String name) ;
                                 
    public void setUser(User user) ;
}



下面是webService的实现类


package com.gdie.service.impl;
import javax.jws.WebParam;
import javax.jws.WebService;
import org.springframework.stereotype.Component;
import com.gdie.service.IComplexUserService;
import com.gdie.service.entities.User;
public class ComplexUserService implements IComplexUserService {
    public User getUserByName(@WebParam(name="name")String name) {
        User user = new User() ;
        user.setId(System.currentTimeMillis()) ;
        user.setName(name) ;
        user.setAddress("china") ;
        user.setEmail(name+"@qq.com") ;
        return user;
    }
    public void setUser(User user) {
        System.out.println("-------Server setUser------------");
        System.out.println("setUser:"+user);
    }
}


然后在配置文件中添加如下:

<jaxws:endpointid="userService"address="/userService" implementor="com.gdie.service.impl.ComplexUserService"/>

这样启动tomcat服务器后,在webBrowser中输入如下地址http://localhost:8080/cxfwebservice/就能看到如下界面(注:cxfwebservice是我的项目名


083437111.png


Cxf客户端如下:

src目录下添加applicatonContext-client.xml内容如下:


<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="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">

<beanid="client"class="com.gdie.service.IComplexUserService"factory-bean="clientFactory"factory-method="create"/>

<beanid="clientFactory"class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">

<propertyname="serviceClass"value="com.gdie.service.IComplexUserService"/>

<propertyname="address"value="http://localhost:8080/cxfwebservice/userService"/>

</bean>



如果是新建的Java application 必须要把刚才的接口类和User类复制过来,并把相关的jar包配置好


package com.gdie.service.main;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.gdie.service.IComplexUserService;
import com.gdie.service.OperatorsService;
import com.gdie.service.entities.Thread;
import com.gdie.service.entities.User;
public class UserServiceTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-client.xml") ;
        IComplexUserService service = (IComplexUserService)context.getBean("client") ;
        User user = service.getUserByName("linben") ;
        System.out.println("result : "+user);
        service.setUser(user) ;
    }
}


以下是cxfSpring整合使用autoAwire annotaton的注意点Demo 如下:

新建接口如下:


package com.gdie.service;
import java.util.List;
import javax.jws.WebService;
import com.gdie.service.entities.Thread;
@WebService
public interface OperatorsService {
    public int getOperators() ;
           
    public List<Thread> getThreads(int page,int size,String info)throws Exception ;
}


实现类代码如下,其中


package com.gdie.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.gdie.service.OperatorsService;
import com.gdie.service.entities.Thread;
import com.gdie.service.services.ForumService;
import com.gdie.service.services.OperatorService;
@Component(value="operatorServiceImpl")
public class OperatorServiceImpl implements OperatorsService{
    @Autowired(required=true)
    private OperatorService service ;
    @Autowired
    private ForumService forumService ;
       
    @Override
    public int getOperators() {
        System.out.println("size");
        int size = 8 ;
        if(null != service)
            try {
                size = this.forumService.getThreadCount() ;
            } catch (Exception e) {
                e.printStackTrace();
            }
        return size ;
    }
    public List<Thread> getThreads(int page,String info)
        throws Exception{
        System.out.println("info ---- >"+info);
        return this.forumService.getThreads(page,size) ;
    }
}


其中类上必须加上@Component(value="operatorServiceImpl")否则接口类无法注入,同时配置文件的改写为添加应用,格式为#+beanName

<jaxws:endpointid="operatorsService"address="/operatorsService"implementor="#operatorServiceImpl"/>

这种格式也是建议使用的格式而不是在 implementor 直接配置类

同时还要加入

<context:annotation-config/>

<context:component-scanbase-package="com.gdie.service"/>

这样在程序加载时就会扫描相关的类,完整的格式如下

<context:annotation-config/>

<context:component-scanbase-package="com.gdie.service"/>

<importresource="classpath:META-INF/cxf/cxf.xml"/>

<jaxws:endpointid="userService"address="/userService"implementor="com.gdie.service.impl.ComplexUserService"/>

<jaxws:endpointid="operatorsService"address="/operatorsService"implementor="#operatorServiceImpl"/>

上面的OperatorServiceForumService可以自己编写,通过使用@Service可是实现

(编辑:李大同)

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

    推荐文章
      热点阅读