package com.vci.ubcs.webservice.config; import com.alibaba.cloud.commons.lang.StringUtils; import com.vci.ubcs.starter.web.util.ApplicationContextProvider; import com.vci.ubcs.starter.web.util.VciBaseUtil; import com.vci.ubcs.webservice.annotation.VciWebservice; import lombok.extern.slf4j.Slf4j; import org.apache.cxf.Bus; import org.apache.cxf.jaxws.EndpointImpl; import org.springframework.aop.support.AopUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.CollectionUtils; import java.util.Map; /** * 发布服务类 * @author weidy * @date 2020/3/27 */ @Configuration @Slf4j public class VciCxfPublishConfig { /** * 注入cxf的bus */ @Autowired(required = false) private Bus bus; /** * 发布站点服务 * @return 站点服务 */ @Bean public void autoPushCxf(){ log.info("开始进行自动发布webService接口"); Map beansWithAnnotation = ApplicationContextProvider.getApplicationContext().getBeansWithAnnotation(VciWebservice.class); if(!CollectionUtils.isEmpty(beansWithAnnotation)){ //找这些bean的 beansWithAnnotation.forEach((beanName,bean)->{ Class targetClass = AopUtils.getTargetClass(bean); VciWebservice annotation = targetClass.getDeclaredAnnotation(VciWebservice.class); if(annotation == null){ targetClass.getAnnotation(VciWebservice.class); } if(annotation!=null){ //我们去找路径和名称 String name = annotation.value(); if(StringUtils.isBlank(name)){ name = VciBaseUtil.toLowForFirst(targetClass.getSimpleName()).replace(".class",""); } String path = annotation.path(); if(StringUtils.isBlank(path)){ path = "/" + name; } //注册 EndpointImpl endpoint = new EndpointImpl(bus,bean); endpoint.publish(path); log.info(String.format("发布接口地址:[%s]", path)); registerBean(endpoint,name + "_EndPoint"); } }); } log.info("weBservice接口自动发布结束"); } /** * 动态注入bean * @param singletonObject 注入对象 * @param beanName bean名称 */ public void registerBean(Object singletonObject,String beanName) { //获取BeanFactory DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) ApplicationContextProvider.getApplicationContext().getAutowireCapableBeanFactory(); //动态注册bean. defaultListableBeanFactory.registerSingleton(beanName, singletonObject); } }