Apache Camel - 25 - CXF - WebService(Code First)

基于Spring Boot和Apache Camel CXF的RESTful API构建实践 本文还有配套的精品资源,点击获取 简介:本项目是一个Java语言编写的实践案例,利用Spring Boot的快速开发特性,结合Apache Camel的灵活路由和Apache CXF对RESTful服务的支持,为开发者展示如何构建一个高性能的RESTful API服务。项目演示了如何在Spring Boot环境下集成Camel和CXF,创建一个可以处理HTTP请求的REST... 阅读详情

本篇文章对应的完整项目源码地址:

15-ApacheCamel-CXF-Demo-Server(Code First)

16-ApacheCamel-CXF-Demo

_16-ApacheCamel-CXF-Demo-Client

"15-ApacheCamel-CXF-Demo-Server(Code First)" 是参照官方Demo例子写的:https://github.com/apache/camel/tree/master/examples/camel-example-cxf

"16-ApacheCamel-CXF-Demo" 是根据日常最简原则写的Demo。

 

Apache Camel 相关所有Demo代码,已上传GitHub,需要的请自取:GitHub - Apache Camel 完整Demo

如果觉得还不错,请点star

 

前言

首先假定,你是使用过Apache CXF 或者 WebService的,如不了解,请先移步 WebService(Apache CXF)分享。

如果你之前看过Apache Camel 集成 CXF的前两篇:

Apache Camel - 14 - CXF组件、Apache Camel - 15 - CXF组件(2)

你会发现,其中的Demo样例,都是基于WSDL文件来发布WebService的。

因为在此之前,没有在官方Demo中找到,也有可能是我看走眼了没有发现(心塞...)。

言归正传,下面看下基于代码优先方式发布WebService

 

 

Apache Camel 集成 Apache CXF 发布WebService,基于代码优先的方式

这里先介绍下WebService(CXF)服务端发布的两种方式:基于WSDL方式 和 纯代码方式

  • 基于WSDL方式:这种方式一般情况是第三方给你一个WSDL文档,然后你根据这个WSDL文档生成服务端代码,JDK原生的我并没有试过,我之前用的都是CXF的命令方式生成的服务端代码,然后在开发业务代码,启动服务端,发布WebService
  • 纯代码方式:这种方式是最原始的方式,也是字面意思,只要你写过WebService,就一定能理解,参考:WebService(3)_开发流程(原生/JDK自带工具)

Apache Camel 集成 CXF 也是可以用以上两种方式来发布WebService,可惜之前我只找到基于WSDL的,可能是我英文不好,错过了。

下面看下关键代码:

pom.xml

<!--apache camel-->
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core</artifactId>
            <version>2.22.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-jetty</artifactId>
            <version>2.22.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-cxf</artifactId>
            <version>2.22.0</version>
        </dependency>

        <!--apache cxf-->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>3.2.5</version>
        </dependency>

        <!--logback-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-access</artifactId>
            <version>1.2.3</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

        <!--apache commons-->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.7</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.1</version>
        </dependency>

        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.2</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

发布的接口,就像开发普通WebService一样,添加@WebService以及@WebMethod注解

package com.server.service;

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

/**
 * @author CYX
 * @create 2018-12-27-19:59
 */
@WebService
public interface BaseicQuery {

    /**
     * 查询人员信息
     *
     * @param queryCondition 基础查询
     * @return
     */
    @WebMethod
    String queryPeopleInfo(@WebParam(name = "queryCondition") String queryCondition);

}

发布接口的实现类

package com.server.service.impl;

import com.server.service.BaseicQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author CYX
 * @create 2018-12-27-20:00
 */
public class BaseicQueryImpl implements BaseicQuery {

    private static final Logger LOGGER = LoggerFactory.getLogger(BaseicQueryImpl.class);

    @Override
    public String queryPeopleInfo(String queryCondition) {

        LOGGER.info("queryCondition : " + queryCondition);

        return "copy that";
    }
}

路由的process处理类:

package com.server.process;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.component.cxf.common.message.CxfConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Method;

/**
 * @author CYX
 * @create 2018-12-27-20:36
 */
public class BaseicQueryProcess implements Processor {

    private static final Logger LOGGER = LoggerFactory.getLogger(BaseicQueryProcess.class);

    private Class<?> beanClass;
    private Object instance;

    public BaseicQueryProcess(Object object) {
        beanClass = object.getClass();
        instance = object;
    }

    @Override
    public void process(Exchange exchange) throws Exception {

        String inputMessage = exchange.getIn().getBody(String.class);
        LOGGER.info("inputMessage : " + inputMessage);

        String operationName = exchange.getIn().getHeader(CxfConstants.OPERATION_NAME, String.class);
        Method method = findMethod(operationName, exchange.getIn().getBody(Object[].class));

        Object response = method.invoke(instance, exchange.getIn().getBody(Object[].class));

        exchange.getOut().setBody(response);
    }

    private Method findMethod(String operationName, Object[] parameters) throws SecurityException, NoSuchMethodException {
        return beanClass.getMethod(operationName, getParameterTypes(parameters));
    }

    private Class<?>[] getParameterTypes(Object[] parameters) {

        if (parameters == null) {
            return new Class[0];
        }
        Class<?>[] answer = new Class[parameters.length];
        int i = 0;
        for (Object object : parameters) {
            answer[i] = object.getClass();
            i++;
        }
        return answer;
    }

}

这个类是关键,它通过反射来调用接口实现类中的方法,仔细看。

路由类:

package com.server.route;

import com.server.App;
import com.server.process.BaseicQueryProcess;
import com.server.service.impl.BaseicQueryImpl;
import org.apache.camel.builder.RouteBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author CYX
 * @create 2018-12-27-20:05
 */
public class BaseQueryRoute extends RouteBuilder {

    private static final Logger LOGGER = LoggerFactory.getLogger(BaseQueryRoute.class);

    @Override
    public void configure() throws Exception {

        from(App.BASEQUERY_SERVICE_URL_ADDRESS).process(new BaseicQueryProcess(new BaseicQueryImpl()));

    }
}

将接口实现类传到process 构造函数中。

主类:

package com.server;

import com.server.conf.LogBackConfigLoader;
import com.server.route.BaseQueryRoute;
import org.apache.camel.CamelContext;
import org.apache.camel.impl.DefaultCamelContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Apache Camel With CXF-JAXRS(Code First)
 * <p>
 * Apache Camel集成Apache CXF-JAXRS,发布WebService(代码优先)
 *
 * @author CYX
 */
public class App {

    private static final Logger LOGGER = LoggerFactory.getLogger(App.class);

    private static final String LOGBACK_FILENAME = "./conf/logback.xml";

    public static final String BASEICQUERY_SERVICE_URL = "http://localhost:9999/baseQueryService";

    public static final String BASEQUERY_SERVICE_URL_ADDRESS = "cxf://" + BASEICQUERY_SERVICE_URL + "?serviceClass=com.server.service.BaseicQuery";

    public static void main(String[] args) {

        try {

            LogBackConfigLoader.loadLogBack(LOGBACK_FILENAME);

            CamelContext camelContext = new DefaultCamelContext();
            camelContext.start();
            camelContext.addRoutes(new BaseQueryRoute());

            LOGGER.info("baseic query service address : " + BASEICQUERY_SERVICE_URL + "?wsdl");

        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
        }

    }
}

主类 启动类 没啥好解释的吧。

以上Demo中,最关键的是process处理类,没有这层调用关系,就没法调用到接口实现类,这个需要注意。

 

看下Demo启动测试,启动服务端:

看下WSDL文档:

然后我们用标准流程生成 Client 客户端代码,调用测试一下:

/**
 * Hello world!
 */
public class ClientApp {

    public static void main(String[] args) {

        BaseicQueryService baseicQueryService = new BaseicQueryService();
        BaseicQuery baseicQuery = baseicQueryService.getBaseicQueryPort();
        String resultMessage = baseicQuery.queryPeopleInfo("server , do you copy");
        System.out.println(resultMessage);

    }

}

 

服务端日志:

客户端接收日志:

 

camel-cxf调用和发布webservice例子 用camel-cxf调用webservice和发布一个webservice接口例子,首先启动QueryServiceMain主函数启动webservice接口,然后启动测试类TestWebservice。例子主要是实现java代码实现camel调用webservice接口 立即下载

相关推荐

使用CXF和camel-cxf调用webservice

NULL 博文链接:https://liugang594.iteye.com/blog/2022626

camel配置webService

xmlns:camel-cxf="http://camel.apache.org/schema/blueprint/cxf"            xmlns:cxfcore="http://cxf.apache.org/blueprint/core"            xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-

sonycong的专栏 3081

05-ApacheCamel-CXF-WebService

05-ApacheCamel-CXF-WebService Apache Camel 集成 CXF组件,包含服务端、测试客户端

camel+cxf+osgi+java对外发布多返回值的webservice服务

前段时间接到新的任务,需要对一个很有年代感的集成系统做新版升级,这套老系统下游有一个小的推送系统通过一个相对独立的小程序定时访问老系统的webservice服务获取数据。由于年代久远,推送系统相关的东西已经没人维护,只能寄希望于新集成下的的ESB按照老的webservice提供一模一样的服务。 新系统下的ESB基于camel、osgi、fuse,因此决定采用camel...

linge-的博客 624

姜宁-我和Apache Camel这些年/Years of Apache Camel and I

该文档来自阿帕奇2015中国路演。姜宁发表了题为“我和Apache Camel这些年/Years of Apache Camel and I”的主题演讲,欢迎下载!

docker部署zabbix6.2.7+grafana

docker部署zabbix6.2.7+grafana。

qq_48391148的博客 3654

使用Apache Camel处理web service请求的三种方法

一: 首先写一个接口,用来发布web service package com.pp.ws; import javax.jws.WebMethod; import javax.jws.WebService; /** * 计算器接口 */ @WebService public interface Calculator { @WebMethod public String getVer

走马行酒醴,驱车布鱼肉 9565

英飞凌IGBT驱动芯片2ED020I12F2去饱和电路设计总结整理收集

记录下英飞凌IGBT驱动芯片限流电阻阻值设计

nizhenyuchina的博客 5994

Camel+CXF+Spring转发气象局WebService例子

今天做个Camel转发WebService的例子。实际的WebService提供者选用国家气象局提供的WebService。程序流程为外部系统调用本平台,然后本地平台调用气象局WebService,最后从气象局取得数据后返回给外部系统。本例中因为要调用气象局WebService,所以请先生成气象局WebService所对应的wsdl文件。生成方法网上比较多这里不在赘述。首先看一下工程的目录结构cn...

weixin_41368339的博客 2396

基于任务的后勤智能体:三段构建与演进设计探究

这是系统智能化的核心难点。例如,对于一个“加强连级滩头阵地防御”子任务,系统会根据防御时长、预期敌军攻击强度、地形等因素,计算出所需的弹药(不同弹种的具体数量)、构筑工事的器材、人员的给养和饮水量、以及医疗救护的药品和血包数量。首先进行分词、词性标注等基础处理,然后利用在军事语料库上训练的命名实体识别(NER)模型,提取出关键实体,如任务类型(“夺控作战”)、作战对象(“Y岛”)、时间约束(“D日H时”、“24小时内”)、成功标准(“建立稳固滩头阵地”)、保障重点(“弹药充足”、“及时救治”)等。

weixin_49042442的博客 1088

赴美参加学术会议办理流程

有幸能在研究生阶段获得学校资助出国参加学术会议,首先要感谢学校的支持,以及学院和实验室的各位老师~ 接下来说下参会整个准备过程: 本人在接到论文录用通知后,就开始办理相关手续。因为会议地点是美国夏威夷,而且录用通知时间与会议召开时间只隔两个月左右,所以接下来两个月时间要办好学校出国申请手续,赴美签证,因为专业原因,据说签证不好办,所以时间比较紧。学校出国申请和签证相关材料是并行进行的,赴美花费...

xingxin_xu的博客 3194

webservice 的日常:webservice的测试之camel

webservice 的日常:webservice的测试之camel 1.webservice的测试. 简介 使用camel-cxf测试webservice 依赖: <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-cxf</artifactId...

zmzmlla的博客 720

antdv-<a-form>的使用

是 Ant Design Vue 中用于创建表单的组件,提供了一种结构化的方式来收集用户输入。它支持多种布局、验证、数据绑定等功能,非常适合用于处理用户输入和提交数据。

2302_81312344的博客 2617

osgi1——camel与cxf发布webservice

经过三个月的osgi学习,今天打算总结一下osgi与blueprint结合,并且使用camel、cxf等框架去做ESB. camel是apache下面一个非常著名的框架,定义了一套路由规则,他的根本原理就是,一端进来——处理——另外一端出去,基于这个高度抽象模型,他扩展的范围非常广,可以去整合HTTP, ActiveMQ, JMS, JBI, SCA, MINA or CXF, WD等等

小牛的成长史 2599

2025年最新自动化/控制保研夏令营&预推免面试真题分享(东南/浙大/华科清华)

笔者来2021级本科自动化专业,以下部分将介绍我在夏令营以及预推免期间发生经历和问题。

Control Everything 2645

SAP BSIS:总账未清项表(Open Items)总账未清项 包含哪些业务 请给以举例说明

SAP总账未清项是指需要未来核销的会计行项目,仅适用于勾选"未清项管理"的总账科目。典型业务场景包括:供应商预付款(借方未清项)、员工备用金(借方未清项)、客户预收款(贷方未清项)和保险理赔(借方未清项)。系统通过表BSIS/BSAS跟踪未清项,支持明细追踪和账实核对。核心价值在于提供总账级别的明细管理能力,确保往来款项完整清账,简化对账流程,满足特殊业务管理需求。可通过FBL3N事务码查询和管理所有总账未清项。

金牌架构师 723

Apache Camel - 14 - CXF组件

Apache Camel CXF(WebService)组件 Apache Camel相关代码已经上传GitHub,需要的自取:GitHub - Apache Camel 完整Demo 如果觉得还行,麻烦点个Star   目前国内,关于Apache Camel 集成CXF(WebService)的样例,似乎没有一个完整的Demo。 关于Apache Camel 集成 CXF(WebSer...

Simba_cheng的博客 4112

Linux内核配置选项详解及编译过程

在内核编译完成后,可以通过重启系统并选择新编译的内核来使用它。可以在该菜单下选择需要编译进内核的设备驱动,也可以选择将设备驱动编译为模块。可以在该菜单下选择需要编译进内核的设备驱动,也可以选择将设备驱动编译为模块。可以选择需要的调试选项,并根据需要启用或禁用相应的功能。可以选择需要的文件系统类型,并根据需要启用或禁用相应的选项。可以选择需要的网络协议和功能,并根据需要启用或禁用相应的选项。可以选择需要的调试选项,并根据需要启用或禁用相应的功能。可以选择需要的文件系统类型,并根据需要启用或禁用相应的选项。

TechGlide的博客 746

Camel转发WebService请求

Camel转发WebService请求方法一:  前端为CXF,OSGI-INF/blueprint/blueprint.xml &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http:/...

java619 1638

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Apache Camel框架入门示例

Apache Camel是Apache基金会下的一个开源项目,它是一个基于规则路由和处理的引擎,提供企业集成模式的Java对象的实现,通过应用程序接口 或称为陈述式的Java领域特定语言(DSL)来配置路由和处理的规则。其核心的思想就是从一个from源头得到数据,通过processor处理,再发到一个to目的的. 这个from和to可以是我们在项目集成中经常碰到的类型:一个FTP文件夹中的文件,

交换一个思想,能得到俩思想 6万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

camel_具有多个查询参数的Camel CXF服务

camel 出色的Apache Camel团队忙于解决查询中多个参数的处理问题,这是一种解决方法。 希望该帖子将在下一版本的Camel中不再使用。 (当前,我使用2.7.5) 问题 大于1的查询参数作为null值传递给Camel-CXF服务。 假设网址中有四个查询参数,例如 name=arun&email=arun@arunma.com&age=10&phone=1234...

cunfen8879的博客 356

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java osgi webservice_osgi1——camel与cxf发布webservice

经过三个月的osgi学习,今天打算总结一下osgi与blueprint结合,并且使用camel、cxf等框架去做ESB.camel是apache下面一个非常著名的框架,定义了一套路由规则,他的根本原理就是,一端进来——处理——另外一端出去,基于这个高度抽象模型,他扩展的范围非常广,可以去整合HTTP,ActiveMQ,JMS,JBI, SCA,MINAorCXF, WD等等。并且实现也非常简单,他...

weixin_39677870的博客 340

Apache Camel配置SSL的CXF

系统环境: java version "1.8.0_66" apache camel: 2.15.2 一:创建证书,并导出公钥证书 二: 1: 加入maven依赖 org.apache.camel camel-cxf 2.15.2 org.apache.camel camel-spring 2.15.2 org.a

走马行酒醴,驱车布鱼肉 2331

Apache Camel - 15 - CXF组件(2)

上一篇文章,大概讲述了Apache Camel集成CXF(WebService)的使用方法。 Apache Camel - 14 - CXF组件 担心有的童鞋看的不是很明白,我这里,详细的写一下。 因为没有现成的参考代码或参考Demo,如果我写的有不对的地方,烦请指正。   这里我将服务端、客户端测试代码上传了,有兴趣的童鞋,可以下载下来,写写看... 05-ApacheCamel-C...

Simba_cheng的博客 1324
上一篇: ZooKeeper UI
下一篇: JVM_1.8_通过递归代码,来看Java虚拟机栈
Simba_cheng
博客等级 码龄11年 250粉丝 203原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值