环境描述:
maven3 + eclipse-jee-kepler-R-win32-x86_64.zip + weblogic 10.3.4 + eclipse的weblogic插件
1、ClassNotFoundException: org.hibernate.hql.ast.HqlToken;
原因:web应用中的antrl包和weblogic中的包出现冲突;
解决办法:
在weblogic.xml的weblogic-web-app下添加配置,以保证使用war包lib下的jar文件:
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
但是,这个时候会出现后边的问题,请看第2、3个问题:
2、java.lang.ClassCastException: weblogic.xml.jaxp.RegistryDocumentBuilderFactory cannot be cast to javax.xml.parser.DocumentBuilderFactroy
原因:war包中的xml-apis-xx.jar和weblogic中的xml解析包出现冲突;
解决办法:从项目中删掉这个jar包,如果是在maven情况下,可以采用maven的方式去掉,比如这个包是引入dom4j时传递引入的包,则可致在依赖中添加exclusion标签去掉
对该jar包的依赖;
3、java.lang.ClassNotFoundException: org.apache.velocity.app.VelocityEngine
原因:不清楚,估计是weblogic采用模板技术来完成一些模板文件的解析,具体以后再查;
解决办法:添加velocity和veloticy-tool两个jar包,如果是maven管理项目,则采用maven的pom.xml中引入这俩组件;
4、java.lang.NoSuchMethodError:javax.persistence.OneToMany.orphanRemoval()Z
原因:weblogic的javax.persistence_xx.jar包相对陈旧
解决办法:
修改应用lib下的hibernate-jpa-2.0-api-xx.jar和上边weblogic中的javax.persistence_xx.jar名字一样,然后替换%weblogic_home%/middleware/modules下的javax.persistence_xx.jar包,这个办法实在是无奈之间,希望以后有更好的办法,比如修改配置可以改变类加载器的加载顺序和路径等来让其加载lib下hibernate提供的jar包;
至此,他娘的总算起来了,不过由于servlet规范的不同(weblogic说tomcat不是真正的遵守规范,扯皮),导致还有一些细节需要修改,姑且记下来:
5、request.getServletPath()的取值不同,在tomcat上如果是系统根目录,则直接返回一个“/”,如果是weblogic,会返回一个空字符串,所以这里要注意下;
6、request.sendRedirect,只写相对路径是不行的,比如/front/login.do,weblogic不会帮你补上上下文路径,而tomcat会自动补上,所以,在weblogic环境下,
浏览器会变成类似于:http://localhost:7001/front/login.do,而丢掉了应用的名称,而tomcat是正确的,会是:http://localhost:8080/应用名称/front/login.do.
解决办法:跳转的路径变成:req.getContextPath() + "/front/login.do",这种方式同时也是兼容tomcat的。
7、session丢失的问题:
原因:查的过程中发现使用HttpServletRequest req = ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST); req.getSession.setAttribute();的方式存储的对象
在后边的请求中取不到了。然后又用System.out.println(session)的方式打印两次session发现拿到的不是同一个session。
解决办法:在weblogic.xml的weblogic-web-app做如下配置,其中cookie-name标签中配置自己的cookie名字即可;
<session-descriptor>
<cookie-name>JSESSIONID1</cookie-name>
</session-descriptor>