使用自定义注解发布webservice服务

使用自定义注解发布webservice服务

  • 概要
  • 代码
    • 自定义注解
    • WebService接口服务发布配置
    • 使用
  • 结果

概要

在springboot使用webservice,发布webservice服务的时候,我们经常需要手动在添加一些发布的代码,比如:

@Bean
public Endpoint organizationEndpoint() {EndpointImpl endpoint = new EndpointImpl(bus, organizationProvider);endpoint.publish("/organization");//在服务端添加日志拦截器。endpoint.getInInterceptors().add(new LoggingInInterceptor());endpoint.getOutInterceptors().add(new LoggingOutInterceptor());return endpoint;
}

每写一个服务就要发布一次,上面的代码就要重复一次,如是就想把这重复的代码通过注解的形式来简化,下面是具体实现。

代码

自定义注解

/*** 自定义发布webservice服务注解*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface WsEndpoint {@NotNull@AliasFor("name")String value() default "";
}

WebService接口服务发布配置


/*** 负责发布WebService服务的配置** 该方法通过WsEndpoint自定义注解来进行统一发布webservice服务* 下方注释部分为正常写法的示例*/
@Configuration
@Slf4j
public class CxfConfig implements CommandLineRunner, ApplicationContextAware, BeanDefinitionRegistryPostProcessor{private ApplicationContext applicationContext;private ConfigurableListableBeanFactory beanFactory;/*@Autowiredprivate Bus bus;@Resourceprivate OrganizationProvider organizationProvider;*//*** 发布 机构endpoint** @return*//* @Beanpublic Endpoint organizationEndpoint() {EndpointImpl endpoint = new EndpointImpl(bus, organizationProvider);endpoint.publish("/organization");//在服务端添加日志拦截器。后续还有更好的方法。endpoint.getInInterceptors().add(new LoggingInInterceptor());endpoint.getOutInterceptors().add(new LoggingOutInterceptor());return endpoint;}*/@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {// 拿到bean工厂对象this.beanFactory = configurableListableBeanFactory;}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {// 拿到上下文对象this.applicationContext = applicationContext;}/*** 项目启动完成后发布webservice服务,在项目没有启动完成前,* 由于bean依赖之类的还没有注入,提前从上下文对象中拿到相关bean发布webservice服务可能会引发依赖问题。* @param args* @throws Exception*/@Overridepublic void run(String... args) throws Exception {log.info("===============================..................   springboot启动完成,发布webservice服务 ...");try {Bus bus = applicationContext.getBean(Bus.class);// 拿到标记了webservice注解的beanString[] beanNamesForAnnotation = applicationContext.getBeanNamesForAnnotation(WebService.class);if (null == beanNamesForAnnotation || beanNamesForAnnotation.length == 0) {return;}// 需要发布的webservice服务for (String beanName : beanNamesForAnnotation) {Object bean = applicationContext.getBean(beanName);// 解析自定义注解并拿到值String path = analyzeClassAndInterfaceAnnotation(bean.getClass());if (StringUtils.isBlank(path)) {// 没有标记自定义注解的webservice服务不会发布continue;}EndpointImpl endpoint = new EndpointImpl(bus, bean);endpoint.publish(path);//在服务端添加日志拦截器。后续还有更好的方法。endpoint.getInInterceptors().add(new LoggingInInterceptor());//返回200时,会记录下返回的SOAP报文。但未能返回200时,看上去记录的依然是输入时的SOAP报文endpoint.getOutInterceptors().add(new LoggingOutInterceptor());beanFactory.registerSingleton(path, endpoint);}} catch (Exception e) {throw new RuntimeException(e);}}/*** 判断当前类及其实现的接口上是否有自定义注解,并且拿到自定义注解的值** @param aClass*/private String analyzeClassAndInterfaceAnnotation(Class<?> aClass) {// 判断当前类上是否有自定义注解Annotation[] annotations = aClass.getAnnotations();for (Annotation annotation : annotations) {if (annotation instanceof WsEndpoint) {return ((WsEndpoint) annotation).value();}}// 判断实现的接口上是否有自定义注解Class<?>[] interfaces = aClass.getInterfaces();if (null == interfaces || interfaces.length == 0) {return null;}for (Class<?> anInterface : interfaces) {Annotation[] interfaceAnnotations = anInterface.getAnnotations();if (null == interfaceAnnotations || interfaceAnnotations.length == 0) {continue;}for (Annotation interfaceClassAnnotation : interfaceAnnotations) {if (interfaceClassAnnotation instanceof WsEndpoint) {return ((WsEndpoint) interfaceClassAnnotation).value();}}}return null;}
}

使用

@WebService(targetNamespace = "http://www.chiss.org.cn/rhin/2015", name = "OrganizationProvider")
@XmlSeeAlso({ObjectFactory.class})
@WsEndpoint("organization")  // 使用自定义注解发布webservice服务接口
public interface OrganizationProvider {/*** 机构注册** @param message* @return* @throws SOAPException*/@WebMethod(operationName = "OrganizationFeed", action = "OrganizationFeed")@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)@WebResult(name = "OrganizationFeedResponse", targetNamespace = "http://www.chiss.org.cn/rhin/2015", partName = "message")public OrganizationFeedResponse organizationFeed(@WebParam(partName = "message", name = "OrganizationFeed", targetNamespace = "http://www.chiss.org.cn/rhin/2015")OrganizationFeed message) throws SOAPException;/*** 机构分页查询** @param message* @return*/@WebMethod(operationName = "OrganizationQuery", action = "OrganizationQuery")@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)@WebResult(name = "OrganizationQueryResponse", targetNamespace = "http://www.chiss.org.cn/rhin/2015", partName = "message")public OrganizationQueryResponseMessage organizationQuery(@WebParam(partName = "message", name = "OrganizationQuery", targetNamespace = "http://www.chiss.org.cn/rhin/2015")OrganizationQueryRequest message) throws SOAPException;}

结果

springboot启动完成后进行webservice服务接口发布
在这里插入图片描述
发布后的接口
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143071.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

破信息壁垒,亿发一站式ERP系统建设,打造五金制造信息管理平台

五金制造拥有明显的行业特征&#xff0c;如体量小、品种繁多、颜色多样、加工工艺不断演进等&#xff0c;呈现出一种独特的管理挑战。大多数五金企业仍然依赖人工管理和经验决策&#xff0c;如今需要寻求更合理和科学的决策方法&#xff0c;以实现生产、销售、仓储、采购和财务…

百度SEO优化技巧(选择、网站结构、内容优化、外链建设、数据分析)

百度关键词SEO优化介绍 SEO是搜索引擎优化的缩写&#xff0c;是指通过优化网站结构、内容和外部链接等方式&#xff0c;提高网站在搜索引擎中的排名&#xff0c;从而获取更多的访问量和流量。百度是中国最大的搜索引擎之一&#xff0c;对于企业来说&#xff0c;优化百度关键词…

uniapp 事件委托失败 获取不到dataset

问题&#xff1a; v-for 多个span ,绑定点击事件 代码:view里包着一个span, <view class"status-list" tap"search"><span class"status-item" v-for"(key,index) in statusList" :key"index" :data-key"k…

USB转换方案介绍

随着科技的不断发展&#xff0c;我们的生活中出现了越来越多的电子设备。然而&#xff0c;这些设备通常具有不同的连接端口和协议&#xff0c;这可能会使它们之间的连接变得困难。这时候&#xff0c;使用USB转换就成为了一种非常方便和实用的解决方法。 无论是在家庭、办公室还…

系统集成|第十章(笔记)

目录 第十章 质量管理10.1 项目质量管理概论10.2 主要过程10.2.1 规划质量管理10.2.2 实施质量保证10.2.3 质量控制 10.3 常见问题 上篇&#xff1a;第九章、成本管理 下篇&#xff1a;第十一章、人力资源管理 第十章 质量管理 10.1 项目质量管理概论 质量管理&#xff1a;指确…

创建型设计模式——工厂模式

摘要 本博文主要介绍软件设计模式中工厂模式&#xff0c;其中工厂设计模式的扩展为简单工厂(Simple Factory)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)三种。 一、简单工厂(Simple Factory) 主要分析设计模式 - 简单工厂(Simple Factory)&#xff0c;它把实例…

PHP8的类与对象的基本操作之类的实例化-PHP8知识详解

定义完类和方法后&#xff0c;并不是真正创建一个对象。类和对象可以描述为如下关系。类用来描述具有相同数据结构和特征的“一组对象”&#xff0c;“类”是“对象”的抽象&#xff0c;而“对象”是“类”的具体实例&#xff0c;即一个类中的对象具有相同的“型”&#xff0c;…

【DETR】

https://tianfeng.space/ 前言 论文 代码 DETR&#xff08;Data-efficient Image Transformer&#xff09;是一种用于目标检测任务的深度学习模型。它与传统的目标检测方法不同&#xff0c;采用了Transformer架构&#xff0c;将目标检测问题转化为一个序列到序列的问题。以下…

Java之IO流概述

1.1 什么是IO 生活中&#xff0c;你肯定经历过这样的场景。当你编辑一个文本文件&#xff0c;忘记了ctrls &#xff0c;可能文件就白白编辑了。当你电脑上插入一个U盘&#xff0c;可以把一个视频&#xff0c;拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢&#xff1f;键…

【数据库——MySQL】(10)视图和索引

目录 1. 视图1.1 创建视图1.2 查询视图 2. 索引2.1 索引的分类2.2 索引的建立 参考书籍 1. 视图 1.1 创建视图 基础语法&#xff1a; CREATE [OR REPLACE] VIEW 视图名[(列名表)]ASSELECT语句[WITH CHECK OPTION]说明&#xff1a; 在默认情况下&#xff0c;将在当前数据库创…

Linux 用户 用户组管理

用户 Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个账号&#xff0c;然后以这个账号的身份进入系统。每个用户账号都拥有一个唯一的用户名和各自的口令。用户在登录时键入正确的用户名和口令后&a…

华为ICT——第二章-数字图像处理私人笔记

目录 1&#xff1a;计算机视觉&#xff1a;​编辑 2&#xff1a;计算机视觉应用&#xff1a;​编辑 3&#xff1a;计算机视界核心问题&#xff1a;​编辑 4&#xff1a;相关学科&#xff1a; 5&#xff1a;计算机视觉与人工智能&#xff1a; 最成熟的技术方向是图像识别 6…

【面试算法——动态规划 20】最长公共子序列 不相交的线

1143. 最长公共子序列 链接: 1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字…

Spring面试题8:面试官:说一说Spring的BeanFactory

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的BeanFactory Spring的BeanFactory是Spring框架的核心容器,负责管理和创建Bean对象。它是一个工厂类,用于实例化、配置和管理Bean的…

SpringBoot 如何使用 Druid 进行数据库连接池管理

使用 Druid 进行数据库连接池管理的 Spring Boot 应用 数据库连接池是任何Web应用程序的重要组成部分&#xff0c;它们有助于管理数据库连接的复用&#xff0c;提高性能和资源利用率。Druid是一个强大的数据库连接池&#xff0c;它具有监控、防SQL注入、快速、可扩展等特点。在…

谈谈最近招人的感受!

最近折腾新的项目&#xff0c;面试了很多实习生小伙伴&#xff0c;我说说我的一些「面试」感受&#xff0c; 虽然是一个老生常谈的话题&#xff0c;但是依然提一下。 准时很重要&#xff1a;提前一点时间&#xff0c;踩个点&#xff0c;别迟到&#xff0c;面试的过程中由于每个…

低功耗引擎Cliptrix为什么可以成为IOT的高效能工具

在万物互联的时代&#xff0c;现代人已普遍接受电视、音箱等电器设备具备智能化能力&#xff0c;也是在这个趋势下&#xff0c;我们身边越来越多的iOT设备联网和交互成为刚需。 但iot设备也面临到一些非常显著的痛点&#xff0c;例如iot设备的内存、处理器等核心元件无法与手机…

爬虫 — 多线程

目录 一、多任务概念二、实现多任务方式1、多进程 &#xff08;Multiprocessing&#xff09;2、多线程&#xff08;Multithreading&#xff09;3、协程&#xff08;Coroutine&#xff09; 三、多线程执行顺序四、多线程的方法1、join()2、setDaemon()3、threading.enumerate() …

python运算函数

简 python输入输出函数input() :用户用于读取键盘输入的函数&#xff0c;返回值为“string”类型 运算函数abs(x) &#xff1a;x的绝对值int(x) &#xff1a;将x转换成整型(截掉小数部分)float(x):浮点数divmod(x,y):返回&#xff08;x//y,x%y&#xff09;complex(re,im):返回一…

linux部署页面内容

/bin&#xff1a;该目录包含了常用的二进制可执行文件&#xff0c;如ls、cp、mv、rm等等。 /boot&#xff1a;该目录包含了启动Linux系统所需的文件&#xff0c;如内核文件和引导加载程序。 /dev&#xff1a;该目录包含了所有设备文件&#xff0c;如硬盘、光驱、鼠标、键盘等等…