CXF全接触(六) --- 让Web Service从Spring中解放出来

通常,CXF对Spring的依赖是非常大的。

先看示例:

http://blog.csdn.net/kunshan_shenbin/archive/2008/12/26/3613918.aspx

但是,如何让组建不依赖于Spring的CXF服务呢?

其实,CXF早就想到了这一点。

下面是一个示例代码(基于Seasar2,支持WS-Security):

CXFNonSpringServletImpl.java

package jp.co.apm.ws.transport; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import jp.co.apm.security.PasswordCallbackHandler; import jp.co.apm.ws.log.CXFLoggingInInterceptor; import jp.co.apm.ws.log.CXFLoggingOutInterceptor; import org.apache.commons.lang.StringUtils; import org.apache.cxf.Bus; import org.apache.cxf.BusFactory; import org.apache.cxf.endpoint.Endpoint; import org.apache.cxf.jaxws.EndpointImpl; import org.apache.cxf.transport.servlet.CXFNonSpringServlet; import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor; import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor; import org.apache.ws.security.handler.WSHandlerConstants; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.SingletonS2ContainerFactory; public class CXFNonSpringServletImpl extends CXFNonSpringServlet { private static final String SERVICE_SUFFIX = "";//"Facade"; private static final long serialVersionUID = 8262880864551976903L; @Override public void loadBus(ServletConfig servletConfig) throws ServletException { super.loadBus(servletConfig); Bus bus = getBus(); BusFactory.setDefaultBus(bus); registerPort("LoginUserService"); registerPort("LoginHstService"); } private S2Container getS2Container() { return SingletonS2ContainerFactory.getContainer(); } private void registerPort(String portName) { EndpointImpl jaxWsEndpoint = (EndpointImpl) EndpointImpl.publish("/" + StringUtils.capitalize(portName), getS2Container().getComponent(portName + SERVICE_SUFFIX)); Endpoint cxfEndPoint = (Endpoint) jaxWsEndpoint.getServer().getEndpoint(); cxfEndPoint.getInInterceptors().add(getKeystoreInInterceptor()); cxfEndPoint.getInInterceptors().add(new CXFLoggingInInterceptor()); cxfEndPoint.getOutInterceptors().add(getKeystoreOutInterceptor()); cxfEndPoint.getOutInterceptors().add(new CXFLoggingOutInterceptor()); } private WSS4JInInterceptor getKeystoreInInterceptor() { Map<String, Object> inProps = new HashMap<String, Object>(); inProps.put(WSHandlerConstants.ACTION, "Encrypt Signature"); inProps.put(WSHandlerConstants.DEC_PROP_FILE, "server_insecurity_enc.properties"); inProps.put(WSHandlerConstants.SIG_PROP_FILE, "server_insecurity_sign.properties"); inProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordCallbackHandler.class.getName()); return new WSS4JInInterceptor(inProps); } private WSS4JOutInterceptor getKeystoreOutInterceptor() { Map<String, Object> outProps = new HashMap<String, Object>(); outProps.put(WSHandlerConstants.ACTION, "Encrypt"); outProps.put(WSHandlerConstants.USER, "apmclient"); outProps.put(WSHandlerConstants.ENC_PROP_FILE, "server_outsecurity_enc.properties"); outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordCallbackHandler.class.getName()); return new WSS4JOutInterceptor(outProps); } }

service.dicon

<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components.dtd"> <components> <include path="jp/co/apm/dicon/LoginUserDao.dicon"/> <include path="jp/co/apm/dicon/LoginHstDao.dicon"/> <component name="LoginUserService" class="jp.co.apm.service.impl.LoginUserServiceImpl" > <property name="loginUserDao">loginUserDao</property> </component> <component name="LoginHstService" class="jp.co.apm.service.impl.LoginHstServiceImpl" > <property name="loginHstDao">loginHstDao</property> </component> </components>

web.xml中把servlet由org.apache.cxf.transport.servlet.CXFServlet改成jp.co.apm.ws.transport.CXFNonSpringServletImpl即可。

你可能感兴趣的:(spring,Web,object,service,Class,callback)