1.配置cxf xml
<import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
2.添加Interceptor 可验证用户名密码,ip..等等--前置监听器
public class CxfUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private Logger log = LoggerFactory.getLogger(CxfUserInterceptor.class); private static ThreadLocal<Map<String, String>> reqHeaderLocal = new ThreadLocal<Map<String, String>>(); public CxfUserInterceptor() { super(Phase.PRE_INVOKE); } /** * 拦截器过滤方法。 */ public void handleMessage(SoapMessage message) throws Fault { if (reqHeaderLocal.get() == null) { reqHeaderLocal.set(new HashMap<String, String>()); } String accountNodeStr = null, passwordNodeStr = null; QName qnameCredentials = new QName("SoapHeader"); if (message.hasHeader(qnameCredentials)) { // 取得请求验证的数据 Header header = message.getHeader(qnameCredentials); Element elementOrderCredential = (Element) header.getObject(); Node accountNode = elementOrderCredential.getFirstChild(); Node passwordNode = elementOrderCredential.getLastChild(); if (accountNode != null) { accountNodeStr = accountNode.getTextContent(); } if (passwordNode != null) { passwordNodeStr = passwordNode.getTextContent(); } //这里验证用户名密码 //...................... } else { throw new Fault(new IllegalAccessException("WebService request paramter no head!")); } }
3.配置拦截器
<bean id="cxfUserInterceptor" class="com.tima.webservice.impl.util.CxfUserInterceptor" />
4.发布方法
@WebService(targetNamespace = "http://user.api.webservice.tima.com/") public interface SysOrgAndUserHandleService { public static final String NAMESPACE = "http://user.api.webservice.tima.com/"; @WebMethod @WebResult(targetNamespace = NAMESPACE) public String sysDemension( @WebParam(targetNamespace = NAMESPACE) String xml,@WebParam(targetNamespace = NAMESPACE) String method); } 接口实现: @WebService(endpointInterface = "com.tima.webservice.api.SysOrgAndUserHandleService", serviceName = "SysOrgAndUserHandleService", targetNamespace = "http://user.api.webservice.tima.com/") public class SysOrgAndUserHandleServiceImpl implements SysOrgAndUserHandleService { @Override public String sysDemension(String xml,String method) { log.info("WebService:sysDemension接收参数:"+xml+",Method:"+method); //方法具体实现。。。。。。 } }
5.后置监听器
public class AfterInterceptor extends AbstractSoapInterceptor { public AfterInterceptor(){ super(Phase.SETUP); } @Override public void handleMessage(SoapMessage msg) throws Fault { // do same thing...... } }
6.xml 配置接口
<bean id="SysOrgAndUserHandleServiceImpl" class="com.tima.webservice.impl.SysOrgAndUserHandleServiceImpl"/> <jaxws:endpoint id="SysOrgAndUserHandleService" implementor="#SysOrgAndUserHandleServiceImpl" implementorClass="com.tima.webservice.impl.SysOrgAndUserHandleServiceImpl" address="/SysOrgAndUserHandleService" > <jaxws:inInterceptors> <ref bean="cxfUserInterceptor" /> </jaxws:inInterceptors> <jaxws:outInterceptors> <ref bean="afterInterceptor" /> </jaxws:outInterceptors> </jaxws:endpoint>
7.附加:
/** * XML 转换 String 返回 对象List集合 * @param element * @param map */ @SuppressWarnings("unchecked") public static void xmlConvertMap(Element element,List<Map<String, Object>> list) { List<DefaultElement> listEl = new ArrayList<DefaultElement>(); //当根节点有数据的时候 if (!CollectionUtils.isEmpty(element.attributes())) { listEl.add((DefaultElement)element); } listEl.addAll(element.elements()); for (DefaultElement def : listEl) { Map<String, Object> map = new HashMap<String, Object>(); List<DefaultAttribute> listAtt = def.attributes(); for (DefaultAttribute att : listAtt) { map.put(att.getName(), att.getValue()); } list.add(map); //xmlConvertMap(def,list); } } /** * 将一个 Map 对象转化为一个 JavaBean * @param type 要转化的类型 * @param map 包含属性值的 map * @return 转化出来的 JavaBean 对象 */ @SuppressWarnings("rawtypes") public static Object convertMapToBean(Class type, Map map) { Object obj = null; try { obj = convertMapExt(type, map); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IntrospectionException e) { e.printStackTrace(); } return obj; } /** * map转换为对象 * @param type * @param map * @return * @throws IntrospectionException * @throws InstantiationException * @throws IllegalAccessException * @throws InvocationTargetException */ @SuppressWarnings("rawtypes") private static Object convertMapExt(Class type, Map map) throws IntrospectionException, InstantiationException, IllegalAccessException, InvocationTargetException { BeanInfo beanInfo = Introspector.getBeanInfo(type); // 获取类属性 Object obj = type.newInstance(); // 创建 JavaBean 对象 // 给 JavaBean 对象的属性赋值 PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor descriptor : propertyDescriptors) { String propertyName = descriptor.getName(); if (map.containsKey(propertyName)) { String typeCls = descriptor.getPropertyType().getName(); Object value = map.get(propertyName); if (typeCls.equals("java.lang.Long")) { descriptor.getWriteMethod().invoke(obj, Long.parseLong(value.toString())); } else if (typeCls.equals("java.util.Date")) { descriptor.getWriteMethod().invoke(obj, DateUtil.parseDate(value.toString())); } else if (typeCls.equals("java.lang.Integer")) { descriptor.getWriteMethod().invoke(obj, Integer.parseInt(value.toString())); } else if (typeCls.equals("java.lang.Double")) { descriptor.getWriteMethod().invoke(obj, Double.parseDouble(value.toString())); } else if (typeCls.equals("java.lang.Float")) { descriptor.getWriteMethod().invoke(obj, Float.parseFloat(value.toString())); } else if (typeCls.equals("java.lang.Short")) { descriptor.getWriteMethod().invoke(obj, Short.parseShort(value.toString())); } else { descriptor.getWriteMethod().invoke(obj,value.toString()); } } } return obj; }