项目从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
[/code]
[/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设为固定,不由系统分配
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值