在同时使用CXF时,Restful API变为404

时间:2016-06-06 10:34:33

标签: cxf spring-integration

我有一个项目启动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/*");
}

3 个答案:

答案 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的方式有两个相互矛盾的设置 -

  1. url-mapping。您正在使用以下代码注入CXF:

    @Bean public ServletRegistrationBean dispatcherServlet() { return new ServletRegistrationBean(new CXFServlet(), "/ws/*"); }

  2. 表示CXF正在侦听的网址为/ws/*

    1. jax-ws服务器!首先,您需要将其更改为jax-rsWS适用于SOAPRS适用于Restful。您已将其地址定义为:

      <jaxws:server id="MyService" address="/ws/MyService"

    2. 表示服务器正在/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;