注解开发cxf整合spring发布地址后访问不到的问题

通过直接注入或 @Bean(name=Bus.DEFAULT_BUS_ID)的方式都能发布地址并能正确访问到,但使用 @Bean创建springBus的方式却无法方位到地址内容,查找网上说的什么CXFServlet配置映射地址不能直接/*,需要在前添加一个串例如/ws/*,试过了无效,开始跟源码查找原因......
cxf与spring整合后,系统启动会默认自动创建springBus,名称为“cxf”

bus保存地址与处理类映射的过程:
EndpointImpl调用publish发布地址,调用doPublish,其中通过gerServer创建处理server,getServer()中JaxWsServerFactoryBean(serverFactory)调用create,create方法中调用父类ServerFactoryBean的create,方法中生成ServerImpl,其构造函数中调用initDestination方法,initDestination方法中调用SoapTransportFactory(destinationFactory)的getDestination,getDestination方法中调用HTTPTransportFactory的getDestination,getDestination方法中通过HttpDestinationFactory创建对应地址的ServletDestination,并通过DestinationRegistryImpl中的destinations(concurrentHashMap)保存地址与ServletDestination的映射

通过地址获取具体处理类的过程:
CXFServlet的loadBus中通过servletConfig.getInitParameter(BUS_PARAMETER)获取bus类的名称如果不设置则默认名字为“cxf”(项目启动后会默认创建名为cxf的默认springBus具体的创建位置未查找),获取到springBus后,CXFNonSpringServlet.getDestinationRegistryFromBusOrDefault通过springBus获取DestinationFactoryManager,DestinationFactoryManager获取HTTPTransportFactory(DestinationFactory),HTTPTransportFactory通过getRegistry获取DestinationRegistryImpl,而DestinationRegistryImpl中的destinations(concurrentHashMap)用于存放地址到目标处理ServletDestination的映射

结论:
综上所述,通过EndpointImpl完成地址发布有两种方式:
1.使用默认的springBus,可直接注入,或使用 @Bean(name=Bus.DEFAULT_BUS_ID)注意此时方法体不会执行,因为spring创建这个bean会去处理方法上的注解,发现注解内对应这个名称的bean是存在的就不会再次走方法了,当然如果在这种方式下加入拦截器例如LoggingInInterceptor、LoggingOutInterceptor、自定义拦截器等的话,可以使用 @PostConstruct
2.使用 @Bean注解方法,方法内创建springBus,但此时必须去配置CXFServlet的位置添加servletConfig配置参数,例如setInitParameter("bu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值