阿帕奇CXF - 如何在没有春天注册一个SOAP服务? [英] Apache CXF - How to register a SOAP service without Spring?
本文介绍了阿帕奇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屋!
查看全文