阿帕奇CXF - 如何在没有春天注册一个SOAP服务? [英] Apache CXF - How to register a SOAP service without Spring?

查看:211
本文介绍了阿帕奇CXF - 如何在没有春天注册一个SOAP服务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要没有Spring配置文件来注册一个SOAP服务。
我知道这是可以做到的,在RESTful服务的情况下(通过使用CXFNonSpringJaxrsServlet和配置在web.xml中),但我怎么能使用SOAP服务类似的东西?
这是我原来的applicationContext.xml:

I need to register a SOAP service without Spring configuration. I know it it is possible to do that in case of RESTFUL service (by using the CXFNonSpringJaxrsServlet and configuring in web.xml) but how could I use something similar for a SOAP service? This is my original applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:cxf="http://cxf.apache.org/core"
   xmlns:jaxws="http://cxf.apache.org/jaxws"
   xmlns:jaxrs="http://cxf.apache.org/jaxrs"
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
   http://cxf.apache.org/core
   http://cxf.apache.org/schemas/core.xsd
   http://cxf.apache.org/jaxws
   http://cxf.apache.org/schemas/jaxws.xsd
   http://cxf.apache.org/jaxrs
   http://cxf.apache.org/schemas/jaxrs.xsd"
   default-autowire="byName">


<!-- Load CXF modules from cxf.jar -->
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml"/>

<bean id="businessServiceabilityService" 
      class="XXXXXXXXXXXXXXXXXXServiceImpl"
      autowire="autodetect"/>
<bean id="jaxbBean"
      class="org.apache.cxf.jaxb.JAXBDataBinding"
      scope="prototype"/>
<bean id="jaxws-and-aegis-service-factory"
      class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"
      scope="prototype">
    <property name="dataBinding" ref="jaxbBean"/>
    <property name="serviceConfigurations">
        <list>
            <bean class="org.apache.cxf.jaxws.support.JaxWsServiceConfiguration"/>
            <bean class="org.apache.cxf.aegis.databinding.AegisServiceConfiguration"/>
            <bean class="org.apache.cxf.service.factory.DefaultServiceConfiguration"/>
        </list>
    </property>
</bean>

<!-- JAX-RS -->
<jaxrs:server id="businessServiceabilityServiceJaxRsServer" address="/bs/rest">
    <jaxrs:serviceBeans>
        <ref bean="businessServiceabilityService"/>
    </jaxrs:serviceBeans>
</jaxrs:server>

<!-- JAX-WS -->
<jaxws:endpoint implementor="#businessServiceabilityService" address="/bs/soap">
    <jaxws:serviceFactory>
        <ref bean="jaxws-and-aegis-service-factory"/>
    </jaxws:serviceFactory>
</jaxws:endpoint>

我怎么能注册SOAP服务?我找不到任何可能性,这样做在web.xml。
web.xml中:

How could I register the SOAP service? I couldn't find any possibility to do that in the web.xml. The web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     version="2.5">
<display-name></display-name>

<servlet>
    <servlet-name>CXFNonSpringJaxrsServlet</servlet-name>
    <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
    <init-param>
        <param-name>jaxrs.providers</param-name>
        <param-value>XXXXXXXXXXXXXXXXXXXServiceImpl</param-value>
    </init-param>
    <init-param>
        <param-name>jaxrs.serviceClasses</param-name>
        <param-value>XXXXXXXXXXXXXXXXXXXServiceImpl</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>CXFNonSpringJaxrsServlet</servlet-name>
    <url-pattern>/cxf/rest/*</url-pattern>
</servlet-mapping>

感谢你在前进!

Thank you in advance! V.

推荐答案

我找到了解决办法。

public class MyServiceServlet extends CXFNonSpringServlet {

private static final long serialVersionUID = 1L;

@Override
// Called at startup time to register this web service.
public void loadBus(ServletConfig servletConfig) throws ServletException {
    super.loadBus(servletConfig);

    Bus bus = getBus();
    BusFactory.setDefaultBus(bus);

    createFactoryBean(servletConfig);
}

private void createFactoryBean(ServletConfig servletConfig) {
    String address = servletConfig.getInitParameter("jaxws.address");
    String provider = servletConfig.getInitParameter("jaxws.provider");
    String serviceClass = servletConfig.getInitParameter("jaxws.serviceClass");

    JaxWsServerFactoryBean fb = new JaxWsServerFactoryBean();
    fb.setAddress(address);
    try {
        fb.setServiceBean(Class.forName(provider).newInstance());
    } catch (Exception e) {
        throw new RuntimeException("The class '"+provider+"' cannot be instantiated!", e);
    }
    try {
        fb.setServiceClass(Class.forName(serviceClass).getClass());
    } catch (ClassNotFoundException e) {
        throw new RuntimeException("The class '"+serviceClass+"' cannot be found!", e);
    } 
    fb.create();
}
}

和web.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     version="2.5">

<display-name></display-name>

<!-- CXF config -->
<servlet>
    <servlet-name>CXFNonSpringJaxrsServlet</servlet-name>
    <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
    <init-param>
        <param-name>jaxrs.providers</param-name>
        <param-value>xxx.BusinessServiceabilityServiceImpl</param-value>
    </init-param>
    <init-param>
        <param-name>jaxrs.serviceClasses</param-name>
        <param-value>xxx.BusinessServiceabilityServiceImpl</param-value>
    </init-param>
</servlet>

<servlet>
    <servlet-name>MyServiceServlet</servlet-name>
    <servlet-class>xxx.MyServiceServlet</servlet-class>
    <init-param>
        <param-name>jaxws.address</param-name>
        <param-value>/almafa</param-value>
    </init-param>
    <init-param>
        <param-name>jaxws.serviceClass</param-name>
        <param-value>com.infoaxon.bpt.services.OACCostingServiceSoap</param-value>
    </init-param>
    <init-param>
        <param-name>jaxws.provider</param-name>
        <param-value>xxx.BusinessServiceabilityServiceImpl</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>CXFNonSpringJaxrsServlet</servlet-name>
    <url-pattern>/cxf/rest/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>MyServiceServlet</servlet-name>
    <url-pattern>/cxf/soap/*</url-pattern>
</servlet-mapping>

</web-app>

这篇关于阿帕奇CXF - 如何在没有春天注册一个SOAP服务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆