项目从tomcat迁移到weblogic下报错的解决方案

项目在tomcat下运行正常,部署到weblogic下,出现问题

1、Caused by: java.lang.ClassNotFoundException:org.joda.time.LocalDate

   原因:缺少joda-time-2.1.jar
   这个包在tomcat下不需要加载,在weblogic下会报缺少这个文件,把这个jar包加进去即可

2、Caused by: java.lang.ClassNotFoundException:org.apache.el.ExpressionFactoryImpl
   原因:缺少jasper-el.jar
   由于项目在tomcat下运行时,默认会加载tomcat的lib的jar包,因此运行正常,迁移到weblogic下后,就会报缺少el的jar包,加进去即可;

3、classnotfoundexception:org.hibernate.hql.ast.hqltoken
   这是由于hibernate3的antlr-2.7.6.jar和weblogic自带的antlr.jar冲突了,在hibernate3以前的解决方案里,多是在配置文件里增加一个property或者在startWebLogic.cmd文件里增加一个set配置,我试了后,均报错,最后采用的解决方案是在WEB-INF里增加一个weblogic.xml文件,设置为默认采用项目里的antlr.jar来执行。

weblogic.xml配置文件:

[code="java"]
true

[/size]

4、java.lang.outofmemoryerror:permgen space
原因:内存溢出,PermGen space的全称是Permanent Generation space,是指内存的永久保存区域, 这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中, 它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对 PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误, 这种错误常见在web服务器对JSP进行pre compile的时候。
weblogic默认给出的内存太小,解决方案是加大内存,找到D:\oracle\Middleware\user_projects\domains\base_domain\bin\ setDomainEnv.cmd文件,打开后将
set MEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=128m
修改为set MEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=256m

注:查到的资料上有要求把MaxPermSize值改成1024m,我改了后weblogic启动不起来,因此改为256m,目前启动还没发现再报内存溢出

5、org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken
如果你是通过eclipse启动weblogic的,那么依次点击windows-preferences-myeclipse workbench-servers-weblogic-weblogic10.x-path,在prepend to classpath选项中,把hibernate要用到的包antlr.jar添加到weblogic的classpath中。
这样在weblogic便可以通过myeclipse正常启动,以上提到的问题解决。


如果你是通过weblogic自带的脚本运行,即通过startWebLogic.cmd启动:
将工程里的antlr.jar拷贝到weblogic的wlserver_10.3\server\lib文件夹下面,在domains\base_domain\bin里找到startWebLogic.cmd文件,在set classpath 的上下分别增加了两句话,如下:
    set PRE_CLASSPATH=%WL_HOME%\server\lib\antlr-2.7.6rc1.jar

    set CLASSPATH=%SAVE_CLASSPATH%

    set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH%

然后启动WebLogic,系统正常运行

6、java weblogic session 丢失
最近遇到一个很郁闷的问题:
我在同一个weblogic下创建了两个domain,部署了两个系统A和B。其中系统A有一个按钮可打开系统B,并自动登录。通过A系统打开B系统后session会发生无规律丢失的情况。经过两天的研究,baidu,goolge了无数次后找到了一个帖子,里面写了一下方法:
        

         这主要是sessionid在影响,你登录第一个web时默认使用jsessionid来记录session id的,放在cookie里 或者url后面,登录第二个时还是默认使用的jsessionid来做的,这样第二个会覆盖第一个jsessionid,所 以表现为session丢失了。

         解决办法如下:两个web使用不同的sessionid来标识,如第一个web使用jsessionid1,第二个web使用 jsessionid2就可以了。 直接在每个web程序下配置weblogic.xml
即将第一个web app的session id标识改为jsessionid1,同理将第二个改为jsessionid2 ,这样你再来做你 的就不会有问题了。

经过实验,果然是因为session id的原因,特写在blog中备份
<?xml version='1.0' encoding='UTF-8'?>
<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<session-descriptor>
<cookie-name>JSESSIONID1</cookie-name>
</session-descriptor>

<jsp-descriptor></jsp-descriptor>
  <container-descriptor></container-descriptor>
  <servlet-descriptor>
    <servlet-name>action</servlet-name>
  </servlet-descriptor>
  <context-root>/ehrp</context-root>

</weblogic-web-app>


7、
weblogic下用@Resource出现No unique bean of type [cn.xx.dao.QueryDAO] is defined的解决办法
最近在使用weblogic时,出现各种问题,其中,有一个问题是这样,在某一个类中,通过@Resource注入一个DAO时,在tomcat时,没有问题,但是在weblogic下,就会出现以下错误:

Caused by: com.bea.core.repackaged.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [cn.xx.dao.QueryDAO] is defined: No beans of type cn.xx.dao.QueryDAO; owner=com.bea.core.repackaged.springframework.context.support.GenericApplicationContext@1af4318: display name [com.bea.core.repackaged.springframework.context.support.GenericApplicationContext@1af4318]; startup date [Wed Jun 04 16:06:59 CST 2014]; parent: com.bea.core.repackaged.springframework.context.support.GenericApplicationContext@11a4ce8
at com.oracle.pitchfork.inject.Jsr250Metadata.getUniqueInstanceOfType(Jsr250Metadata.java:354)
at com.oracle.pitchfork.inject.Jsr250Metadata.resolveByType(Jsr250Metadata.java:348)
at com.oracle.pitchfork.inject.Jsr250Metadata.resolve(Jsr250Metadata.java:278)
at com.oracle.pitchfork.inject.Jsr250Metadata.applyInjections(Jsr250Metadata.java:231)

试了各种方法:

办法1:

将以下代码

@Resource("queryDAO")
public QueryDAO queryDAO;

修改为

@Autowired(required = false)
@Qualifier("queryDAO")
public QueryDAO queryDAO;

办法2:

出现这个问题的根本原因,其实还是因为weblogic加载jar包时,默认加载weblogic自己的jar包,但是其jar包版本过低,所以根本解决办法是:

修改WEB-INF下的weblogic.xml,我的工程的weblogic.xml的完整代码为:

    <?xml version="1.0" encoding="UTF-8"?>  
    <wls:weblogic-web-app  
    xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"  
    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/ejb-jar_3_0.xsd  
    http://xmlns.oracle.com/weblogic/weblogic-web-app  
    http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">  
      
         <wls:container-descriptor>  
             <wls:prefer-application-packages>  
                 <wls:package-name>com.google.common.*</wls:package-name>  
                 <wls:package-name>javax.jws.soap.*</wls:package-name>  
                 <wls:package-name>javax.xml.ws.*</wls:package-name>  
                 <wls:package-name>javax.annotation.*</wls:package-name>  
             </wls:prefer-application-packages>  
         </wls:container-descriptor>  
         <wls:resource-env-description>  
             <wls:resource-env-ref-name>queryDAO</wls:resource-env-ref-name>  
             <wls:jndi-name>dataSource</wls:jndi-name>  
         </wls:resource-env-description>  
         <wls:resource-env-description>  
             <wls:resource-env-ref-name>updateDAO</wls:resource-env-ref-name>  
             <wls:jndi-name>dataSource</wls:jndi-name>  
         </wls:resource-env-description>  
    </wls:weblogic-web-app>  


8、Spring + JAX-WS : ‘xxx’ is an interface, and JAXB can’t handle interfaces 错误解决方法
错误栈:
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
demo.order.dao.ParamDao is an interface, and JAXB can't handle interfaces.
        this problem is related to the following location:
                at demo.order.dao.ParamDao
                at private demo.order.dao.ParamDao demo.jaxrs.server.jaxws_asm.SetParamDao.arg0
                at demo.jaxrs.server.jaxws_asm.SetParamDao
demo.order.dao.ParamDao does not have a no-arg default constructor.
        this problem is related to the following location:
                at demo.order.dao.ParamDao ....



解决方法:标记该方法为非web method
    private ParamDao paramDao;
   
    @WebMethod(exclude = true)
        public void setParamDao(ParamDao paramDao) {
                this.paramDao = paramDao;
        }

ref: http://www.mkyong.com/webservices/jax-ws/spring-jax-ws-xxx-is-an-interface-and-jaxb-cant-handle-interfaces/

9、信息: Your platform does not provide complete low-level API for accessing direct buffers reliably. Unless explicitly requested, heap buffer will always be preferred to avoid potential system unstability.
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Cannot create a secure XMLInputFactory
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:159)
at $Proxy64.getCaseStatusCount(Unknown Source)
at com.hjdf.cnmsa.cxf.webservice.punishmentSnapshotService.client.ClientTest.main(ClientTest.java:19)
Caused by: org.apache.cxf.binding.soap.SoapFault: Cannot create a secure XMLInputFactory
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:798)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1636)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1525)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1330)
at org.apache.cxf.transport.http.netty.client.NettyHttpConduit$NettyWrappedOutputStream.close(NettyHttpConduit.java:153)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:638)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:326)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:279)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:137)
... 2 more

10、weblogic启动后获取不到session的问题
    增加一个weblogic.xml文件,将jsessionid设为固定,不由系统分配

你可能感兴趣的:(weblogic)