【问题标题】:Spring Boot : Apache CXF SOAP with @RestControllerSpring Boot:带有 @RestController 的 Apache CXF SOAP
【发布时间】:2017-02-08 11:07:27
【问题描述】:

我正在使用 @RestController 制作 Spring Boot 休息服务,在同一个项目中,我还公开了 Apache CXF SOAP 服务,例如

@RestController 代码

@RestController
@RequestMapping(value = "/mobileTopUpService")
public class TopUpRestService {

@RequestMapping(value="/processTopUpRequest", method=RequestMethod.POST,
            consumes = MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE)

    public ResponseEntity<TopUpRequestDTO> processTopUpRequest(HttpServletRequest httpServletRequest, @Valid RequestEntity<TopUpRequestDTO> _requestEntity) {


        return new ResponseEntity<>(new exampleDTO("hi"), HttpStatus.OK);
    }
}

Apache CXF SOAP

    @Configuration
    @Import(ApplicationConfiguration.class)
    public class WebServiceConfig
    {
        public static final String SERVLET_MAPPING_URL_PATH = "/*";
        public static final String SERVICE_NAME_URL_PATH = "/services";

        @Autowired
        private ApplicationConfiguration applicationConfiguration;

        @Bean
        public ServletRegistrationBean dispatcherServlet()
        {
            return new ServletRegistrationBean(new CXFServlet(), SERVLET_MAPPING_URL_PATH);
        }

        @Bean(name = Bus.DEFAULT_BUS_ID)
        public SpringBus springBus()
        {
            return new SpringBus();
        }

        @Bean
        public ERSBackendService ersBackendServiceImpl()
        {
            return new ERSBackendServiceImpl();
        }

        @Bean
        public Endpoint endpoint()
        {
            EndpointImpl endpoint = new EndpointImpl(springBus(), ersBackendServiceImpl());
            endpoint.publish(SERVICE_NAME_URL_PATH);

            AutomaticWorkQueue executorQueue = createThreadPoolExecutorQueue();
            endpoint.setExecutor(executorQueue);

            return endpoint;
        }
@Bean
public EmbeddedServletContainerFactory embeddedServletContainerFactory()
{
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory("/backend-service", Integer.valueOf(applicationConfiguration.getPort()));
    return factory;
}
}

更改后 SOAP 服务运行良好,但 REST (@RestController) 停止工作,但如果我禁用这些方法

//  @Bean
//  public ServletRegistrationBean dispatcherServlet()
//  {
//      return new ServletRegistrationBean(new CXFServlet(), SERVLET_MAPPING_URL_PATH);
//  }

    @Bean
//  public EmbeddedServletContainerFactory embeddedServletContainerFactory()
//  {
//      TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory("/backend-service", Integer.valueOf("8007"));
//      return factory;
//  }
//}

然后运行 http://localhost:8007/mobileTopUpService/processTopUpRequest/ @RestController 运行良好,但不是肥皂。

我需要同时运行 @RestController 和 CXF SOAP,请建议。

谢谢

【问题讨论】:

    标签: soap spring-boot cxf spring-restcontroller


    【解决方案1】:

    我刚刚一起使用 SOAP 和 REST 服务。这是我的配置:(在答案的最后,我包含了一个示例项目)

    application.properties

    cxf.path=/services
    cxf.servlet.load-on-startup=-1
    

    WebServiceConfig

    @Configuration
    @ConditionalOnWebApplication
    public class WebServiceConfig {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(WsEndpointsConfiguration.class);
    
    
        @Autowired
        private Bus bus;
    
    
        @Value("${cxf.path}")
        private String cxfServletPath;
    
    
        @Autowired
        private YourServiceInterface yourService;
    
    
        public Logger getLOGGER() {
            return LOGGER;
        }
    
    
        public Bus getBus() {
            return bus;
        }
    
    
        public String getCxfServletPath() {
            return cxfServletPath;
        }
    
    
        public void setCxfServletPath(String cxfServletPath) {
            this.cxfServletPath = cxfServletPath;
        }
    
    
        public YourServiceInterface getYourServiceInterface() {
            return yourService;
        }
    
    
        @Bean
        public Endpoint yourWebServiceEndpoint() {
            EndpointImpl endpoint = new EndpointImpl(getBus(), new YourWebServiceEndpoint(getYourServiceInterface()));
            endpoint.publish("/YourWebService");
            return endpoint;
        }
    
    
        @Bean
        public FilterRegistrationBean openEntityManagerInViewFilter() {
            FilterRegistrationBean filterRegBean = new FilterRegistrationBean();
            filterRegBean.setFilter(new OpenEntityManagerInViewFilter());
            List<String> urlPatterns = new ArrayList<String>();
            urlPatterns.add(getCxfServletPath() + "/*");
            filterRegBean.setUrlPatterns(urlPatterns);
            if (getLOGGER().isDebugEnabled()) {
                getLOGGER().debug("Registering the 'OpenEntityManagerInViewFilter' filter for the '"
                    .concat(getCxfServletPath() + "/*").concat("' URL."));
            }
            return filterRegBean;
        }
    }
    

    用你自己的服务接口替换@Autowired服务。

    您可以在此处查看完整示例:

    https://github.com/jcagarcia/proofs/tree/master/spring-security-and-formatters

    上面提供的示例中的相关类:

    希望对你有帮助,

    【讨论】:

      【解决方案2】:

      我在启动启动应用程序的类中将其解析为@EnableWebMvc 即 SpringApplication.run(ApplicationStartup.class, args);

      在 Spring Boot 类中也移动了 ServletRegistrationBean,

      禁用方法 @豆 公共 EmbeddedServletContainerFactory EmbeddedServletContainerFactory() {...}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-05
        • 1970-01-01
        • 2016-01-15
        • 2018-12-15
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 1970-01-01
        相关资源
        最近更新 更多