ce97
作者ce97·2015-03-27 18:03
软件开发工程师·某某某

cxf和axis2整合项目从jboss迁至weblogic

字数 24707阅读 2241评论 0赞 0

项目开发初期用的中间件服务器是jboss,在jboss下面运行的很好。需求变更,上面要求更换中间件服务器。开始认为这是个简单的事情,就是一个部署问题。直到将项目在weblogic部署运行的一瞬间,彻底傻眼了。一大堆的错误。

项目的主体框架是ssh,在加上cxf:2.7.8,axis:1.6.2,quazr框架。
虽然问题解决了,但不得不吐槽一句,每一个中间件运行机制都不一样,所带的jar,也不样。是想累死我们这些程序猿。能不能统一下标准。

遇到的问题太多,都不清,也没记录下来。就把解决问题配置和代码贴出来。

web.xml
需要注意的地方,在jboss,tomcat下面,项目在运行的过程会解包,就不会存在路径找不到问题,而weblogic就会。典型的就是org.springframework.web.util.Log4jConfigListener。日志路径问题。网上有很多方法,有让直接servlet代替,都不靠谱。这是我查看Log4jConfigListener源码找到的方法。绝对的有效。提醒一下,如果有什么配置文件最好是放在classses路径下面。

  1. <context-param>  
  2.   <param-name>log4jConfigLocation</param-name>  
  3.   <param-value>classpath:log4j.xml</param-value>  
  4.  </context-param>  
  5.    
  6.  <!-- 是否暴露WebAppRoot weblogic需要此设置-->  
  7. <context-param>  
  8.     <param-name>log4jExposeWebAppRoot</param-name>  
  9.     <param-value>false</param-value>  
  10. </context-param>  
  11.   
  12.  <!-- 指定webAppRootKey weblogic需要此设置-->  
  13.  <context-param>  
  14.     <param-name>webAppRootKey</param-name>  
  15.     <param-value>mywebApp.root</param-value>  
  16. </context-param>  
  17. <!-- 配置spring的监听器 -->  
  18.  <context-param>  
  19.   <param-name>contextConfigLocation</param-name>  
  20.   <param-value>classpath:spring/applicationContext.xml</param-value>  
  21.  </context-param>  
  22.    
  23.  <!-- log4j配置 -->   
  24.   <listener>  
  25.   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  


cxf和axis2

cxf和axi2在整合的过程中,会存在冲突,最主要是jar文件
cxf
org.apache.ws.xmlschema:xmlschema-core:jar:2.0.3:compile
axis2
删除
org.apache.ws.commons.schema:XmlSchema:jar:1.4.7:compile
stax:stax-api:jar:1.0.1:compile

cxf在用到wssj安全认证的时候,会遇到错误,需要设置相应的环境变量
cxf 客户端测试webserice

  1. public static <T> T  getWsSecurityServivce(Class<T> servivceclass,String username,String password,String url,Boolean openInterceptorlog){  
  2.               
  3.         T t=null;  
  4.   
  5.         if(!"com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl".equals(System.getProperty("org.apache.cxf.binding.soap.messageFactoryClassName"))){  
  6.               
  7.             System.setProperty("org.apache.cxf.binding.soap.messageFactoryClassName","com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl");  
  8.         }  
  9.           
  10.           
  11.         Map<String,Object> outProps = new HashMap<String,Object>();  
  12.         outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);  
  13.         outProps.put(WSHandlerConstants.USER, username);//这个用户即服务器端配置的用户名  
  14.         outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);  
  15.         //这个类用来获取客户端认证用户名密码信息  
  16.         outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, ClientAutherHandler.class.getName());  
  17.         //outProps.put(WSHandlerConstants.MUST_UNDERSTAND, "0");  
  18.             
  19.         if(openInterceptorlog){  
  20.           
  21.             jaxWsProxyFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor());    
  22.             jaxWsProxyFactoryBean.getOutFaultInterceptors().add(new LoggingOutInterceptor());   
  23.               
  24.         }  
  25.           
  26.         jaxWsProxyFactoryBean.getOutInterceptors().add(new SAAJOutInterceptor());  
  27.         //密码验证拦截器 必须放置create方法前  
  28.         jaxWsProxyFactoryBean.getOutInterceptors().add(new WSS4JOutInterceptor(outProps));  
  29.         jaxWsProxyFactoryBean.setServiceClass(servivceclass);  
  30.         jaxWsProxyFactoryBean.setAddress(url);   
  31.         t = jaxWsProxyFactoryBean.create(servivceclass);  
  32.               
  33.         return t;  
  34.         }  



ClientAutherHandler

  1. package com.telecommunications.util;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Map;  
  5. import java.util.Set;  
  6.   
  7. import javax.security.auth.callback.Callback;  
  8. import javax.security.auth.callback.CallbackHandler;  
  9. import javax.security.auth.callback.UnsupportedCallbackException;  
  10.   
  11. import org.apache.log4j.Logger;  
  12. import org.apache.ws.security.WSPasswordCallback;  
  13.   
  14. /** 
  15.  * 客户端用户名账号和密码验证 
  16.  * @author Administrator 
  17.  * 
  18.  */  
  19. public class ClientAutherHandler implements CallbackHandler{  
  20.     public static Logger logger=Logger.getLogger(ClientAutherHandler.class);  
  21.       
  22.     private Map<String,String> users;  
  23.       
  24.     public Map<String, String> getUsers() {  
  25.         return users;  
  26.     }  
  27.   
  28.     public void setUsers(Map<String, String> users) {  
  29.         this.users = users;  
  30.     }  
  31.   
  32.     public void handle(Callback[] callbacks) throws IOException,  
  33.             UnsupportedCallbackException {  
  34.           
  35.         WSPasswordCallback  pc=(WSPasswordCallback) callbacks[0];  
  36.         String username=pc.getIdentifier();  
  37.         //System.out.println("------username----"+username);  
  38.         if(null!=users){  
  39.             Set<String> keyusers=users.keySet();  
  40.             for(String key:keyusers){  
  41.                 if(key.equals(username)){  
  42.                     pc.setIdentifier(username);  
  43.                     pc.setPassword(users.get(key));  
  44.                     break;  
  45.                 }  
  46.             }  
  47.               
  48.         }else{  
  49.               
  50.             String password=WsPropertiesUtil.properties.getProperty(username);  
  51.             if(null==password||"".equals(password)){  
  52.                 logger.warn(" ws-Security安全认证"+username+"密码未空");  
  53.             }  
  54.             pc.setIdentifier(username);  
  55.             pc.setPassword(password);  
  56.     }  
  57.   
  58.     }  
  59.   
  60. }  




如果你的wssj客户端和spring继承了你就配置拦截器。

cxf 服务端
spring配置

  1. <jaxws:server id="pWsSicfrevenueauditoutsynService"   
  2.        serviceClass="com.telecommunications.ws.serviceimp.WsSicfrevenueauditoutsynServiceImp"  
  3.        address="/pWsSicfrevenueauditoutsynServiceImp">  
  4.    
  5.          
  6.        <!--发布服务的bean  -->  
  7.        <jaxws:serviceBean>  
  8.        <bean class="com.telecommunications.ws.serviceimp.WsSicfrevenueauditoutsynServiceImp"></bean>  
  9.            <!-- 要暴露的 bean 的引用 -->  
  10.        </jaxws:serviceBean>  
  11.            <jaxws:inInterceptors>   
  12.            <ref bean="loggingInInterceptor"/>  
  13.            <bean class="com.telecommunications.interceptor.CxfWssJSystemEnvIntercepter"></bean>  
  14.                   
  15.              <bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />    
  16.              <bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">    
  17.                 <constructor-arg>    
  18.                    <map>    
  19.                        <entry key="action" value="UsernameToken" />    
  20.                        <entry key="passwordType"    
  21.                            value="PasswordText" />    
  22.                        <entry key="user" value="EDA" />    
  23.                        <entry key="passwordCallbackRef">    
  24.                            <ref bean="serverAutherHandler" />    
  25.                        </entry>    
  26.                    </map>    
  27.                </constructor-arg>    
  28.            </bean>   
  29.            
  30.             
  31.          </jaxws:inInterceptors>   
  32.       <jaxws:outInterceptors>  
  33.             <ref bean="loggingOutInterceptor"/>  
  34.       </jaxws:outInterceptors>  
  35.    </jaxws:server>  



CxfWssJSystemEnvIntercepter类

  1. package com.telecommunications.interceptor;  
  2.   
  3. import org.apache.cxf.interceptor.Fault;  
  4. import org.apache.cxf.message.Message;  
  5. import org.apache.cxf.phase.AbstractPhaseInterceptor;  
  6. import org.apache.cxf.phase.Phase;  
  7.   
  8. public class CxfWssJSystemEnvIntercepter extends AbstractPhaseInterceptor<Message>{  
  9.   
  10.   
  11.     public CxfWssJSystemEnvIntercepter(String phase) {  
  12.             super(phase);  
  13.     }  
  14.       
  15.     public CxfWssJSystemEnvIntercepter(){  
  16.         super(Phase.RECEIVE);  
  17.     }  
  18.           
  19.     @Override  
  20.     public void handleMessage(Message message) throws Fault {  
  21.           
  22.         if(null==System.getProperty("org.apache.cxf.binding.soap.messageFactoryClassName")||"".equals(System.getProperty("org.apache.cxf.binding.soap.messageFactoryClassName"))){  
  23.               
  24.             System.setProperty("org.apache.cxf.binding.soap.messageFactoryClassName","com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl");  
  25. //linux 环境下需要做此设置 要不按Woodstox 4.2.0 有点问题  
  26.             System.setProperty("org.apache.cxf.stax.allowInsecureParser","1");      
  27.             System.setProperty("org.apache.cxf.stax.maxChildElements","50000");  
  28.             System.setProperty("org.apache.cxf.stax.maxElementDepth","100");  
  29.             System.setProperty("org.apache.cxf.stax.maxAttributeCount","500");  
  30.             System.setProperty("org.apache.cxf.stax.maxAttributeSize",String.valueOf(64 * 1024));  
  31.             System.setProperty("org.apache.cxf.stax.maxTextLength",String.valueOf(128 * 1024 * 1024));  
  32.             System.setProperty("org.apache.cxf.stax.maxElementCount",String.valueOf(Long.MAX_VALUE));  
  33.             System.setProperty("org.apache.cxf.stax.maxXMLCharacters",String.valueOf(Long.MAX_VALUE));  
  34.             System.setProperty("org.apache.cxf.staxutils.innerElementCountThreshold",String.valueOf(50000));  
  35.             System.setProperty("org.apache.cxf.staxutils.innerElementLevelThreshold",String.valueOf(100));  
  36.         }  
  37.           
  38.           
  39.     }  
  40.       
  41.   
  42. }  



serverAutherHandler

  1. /** 
  2.  * 用户名账号和密码验证 
  3.  * @author Administrator 
  4.  * 
  5.  */  
  6. public class ServerAutherHandler implements CallbackHandler{  
  7.     public static Logger logger=Logger.getLogger(ServerAutherHandler.class);  
  8.       
  9.     private Map<String,String> users;  
  10.       
  11.     public Map<String, String> getUsers() {  
  12.         return users;  
  13.     }  
  14.   
  15.     public void setUsers(Map<String, String> users) {  
  16.         this.users = users;  
  17.     }  
  18.   
  19.     public void handle(Callback[] callbacks) throws IOException,  
  20.             UnsupportedCallbackException {  
  21.           
  22.       
  23.       
  24.         WSPasswordCallback  pc=(WSPasswordCallback) callbacks[0];  
  25.         String username=pc.getIdentifier();  
  26.         //String password=pc.getPassword();  
  27.           
  28.         //System.out.println("username"+username);  
  29.         //System.out.println("password"+password);  
  30.           
  31.         if(null==users){  
  32.             logger.info("----未设置服务端验证账号和密码--------");  
  33.         }else{  
  34.             Set<String> keyusers=users.keySet();  
  35.             for(String key:keyusers){  
  36.                 if(key.equals(username)){  
  37.                       
  38.                     pc.setPassword(users.get(key));  
  39.                       
  40.                       
  41.                     break;  
  42.                 }  
  43.                   
  44.             }  
  45.         }  
  46.           
  47.           
  48.           
  49.     }  
  50.   
  51. }  


hibernate
ClassNotFoundException: org.hibernate.hql.ast.HqlToken

1 把项目下 jar  antlr:antlr:jar:2.7.6 复制到自建域lib文件夹下面(看自己喜欢)
D:weblogicinstalluser_projectsdomainsmyuser_domainlib
2 修改 setDomainEnv.cmd文件
D:weblogicinstalluser_projectsdomainsmyuser_domainbin
set PRE_CLASSPATH=D:weblogicinstalluser_projectsdomainsmyuser_domainlibantlr-2.7.6.jar
set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH%


weblogic
weblogic自带有webserive相关的jar.所以部署会和项目相关的jar冲突,还有就是jar加载先后顺序的问题。这是个头疼的事情。会造成一系列的问题。
在WEB-INF新建一个weblogic.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <weblogic-web-app>    
  3. <context-root>/mywebname</context-root>  
  4.   <container-descriptor>    
  5.     <prefer-web-inf-classes>false</prefer-web-inf-classes>    
  6.       
  7.     <prefer-application-resources>    
  8.         <resource-name>META-INF/services/javax.xml.ws.spi.Provider</resource-name>    
  9.     </prefer-application-resources>    
  10.     <prefer-application-packages>    
  11.          <package-name>org.python.core.*</package-name>   
  12.          <package-name>com.ctc.wstx.*</package-name>  
  13.     </prefer-application-packages>    
  14.     </container-descriptor>    
  15.  </weblogic-web-app>   



希望犯过的错误对各位有帮助,转载请说明出处
-----------------------------------------------------------------
现在项目遇到一个问题linux环境下会有警告信息:WARN : org.apache.cxf.staxutils.StaxUtils - Could not create a secure Stax XMLInputFactory.  Found class com.ctc.wstx.stax.WstxInputFactory.  Suggest Woodstox 4.2.0 or newer.不影响正常使用。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广