我有一个项目启动Spring Boot。 它通过Spring Integration入站网关提供了一些宁静的API。 之后,一些Web服务端点通过CXF添加到项目中。
当我设置CXFServlet映射时,所有restful API都变为404。
只有我暂停CXF配置再次使用的restful API。
在使用CXF期间,我是否知道是否存在阻止restful API或spring集成入站网关的任何内容?
CXFServlet和总线
@Configuration
@ComponentScan("com.kennie")
@ImportResource("classpath:cxf-services.xml")
public class SimbaAdapterApplicationConfiguration {
@Bean
public ServletRegistrationBean dispatcherServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/ws/*");
}
@Bean(name=Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
SpringBus bus = new SpringBus();
bus.getInInterceptors().add(new LoggingInInterceptor());
bus.getOutInterceptors().add(new LoggingOutInterceptor());
return bus;
}
XML配置
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<jaxws:server id="MyService" address="/ws/MyService"
serviceClass="com.kennie.IMyService" >
<jaxws:serviceBean>
<ref bean="myServiceImpl" />
</jaxws:serviceBean>
</jaxws:server>
服务接口
@WebService
public interface IMyService{
@WebMethod
public @WebResult(name = "Response") Response doRequest(
@WebParam(name = "Request", mode = WebParam.Mode.IN)
Request request
);
}
这是我的解决方案,获取DispatcherServlet并指定映射避免根上下文。
@Bean
public ServletRegistrationBean dispatcherMVCServlet(@Qualifier("dispatcherServlet") DispatcherServlet dispatcherServlet) {
return new ServletRegistrationBean(dispatcherServlet, "/int-http/*");
}
答案 0 :(得分:0)
我不熟悉CXF,但我知道Spring Integration HTTP完全基于Spring MVC。因此,如果您可以通过CXF配置Spring MVC,那么所有这些Spring Integration HTTP入站网关也将可用。
我认为你的问题在于区分Servlet映射。
看起来您的REST API是通过CXF Servlet进行路由的,而且它不喜欢它,因此拒绝。
答案 1 :(得分:0)
将CXF
添加到代码中时,所有RESTful API都将通过它进行路由。
我看到你配置CXF的方式有两个相互矛盾的设置 -
url-mapping
。您正在使用以下代码注入CXF:
@Bean
public ServletRegistrationBean dispatcherServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/ws/*");
}
表示CXF正在侦听的网址为/ws/*
。
jax-ws
服务器!首先,您需要将其更改为jax-rs
。 WS
适用于SOAP
。 RS
适用于Restful。您已将其地址定义为:
<jaxws:server id="MyService" address="/ws/MyService"
表示服务器正在/ws/MyService
CXF和jax-rs服务器都在用ws / something监听。现在,这不是一个真正的问题。您只需将此添加到您正在访问的URL中,以便完整的URL如下所示:
http:<server>:<port>/<context-root>/<CXF Endpoint>/<jax-rs server address>/<REST API endpoint>
我猜你不希望ws在网址中出现两次。将其从jax-rs
地址中删除。
希望这有帮助。
答案 2 :(得分:0)
您可以为http rest api注册更多的servlet,此方法已经过测试,可以: @SpringBootApplication( // scanBasePackages = {“ com.huawei.manage”} ) 公共类申请{
@Bean
public ServletRegistrationBean dispatcherServlet() {
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.scan("com.huawei.manage.hsf.controller");
DispatcherServlet rest_dispatcherServlet = new DispatcherServlet(applicationContext);
ServletRegistrationBean registrationBean = new ServletRegistrationBean(rest_dispatcherServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/*");
return registrationBean;