一、org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined
解决:将web.xml中
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/applicationContext*.xml
</param-value>
</context-param>
修改成:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value> classpath*:applicationContext.xml,classpath*:applicationContext_time.xml,classpath*:applicationContext-security.xml
</param-value>
</context-param>
原因:weblogic解析web.xml时不支持通配符
二、ClassNotFoundException: org.hibernate.hql.ast.HqlToken
解决:将antlr-2.7.6.jar放到C:\oracle\Middleware\jrockit_160_17_R28.0.0-679\jre\lib\ext下面
原因:Weblogic默认先加载EJB-QL parser,存在重名类.将antlr-2.7.6.jar放于weblogic所用jdk的lib/ext下
可先加载antlr-2.7.6.jar
三、报CSRF错误
解决:将以前web.xml关于dwr的servlet配置:
<servlet>
<servlet-name >dwr</servlet-name>
<servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
修改成
<servlet>
<servlet-name >dwr</servlet-name>
<servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>allowScriptTagRemoting</param-name>
<param-value>true</param-value>
</init-param> <load-on-startup>1</load-on-startup>
</servlet>
原因:dwr跨域访问的安全问题,weblogic加强了安全机制
四、因为用的struts2 convention 零配置,启动后运行报no action found error 错误,找不到action;
解决:这个问题比较麻烦:
首先要更新struts2.1.6到struts2.2.1.
另外:将struts.xml加入
<constant name="struts.convention.action.fileProtocols" value="jar,zip" />
<constant name="struts.convention.action.includeJars" value=".*?/_wl_cls_gen.*?jar(!/)?" />
最后:将src文件夹加入META-INF文件夹。里面放入任意文件,目的是让其它编译到classes文件夹下
原因:我也说不清楚,参考的网友的这篇文章:http://aaa5131421.iteye.com/blog/558463
最后,为了达到最好的性能,将以前的dbcp换成weblogic的数据源吧。
配置方法很简单:
weblogic中首先创建一个数据源例如:jndi名称为:jdbc/db301,数据源的连接池初始大小以最大数根据实际情况作出配置
然后在applicationContext.xml中加入
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/db301" />,替换以前的datasource配置
五、tomcat程序迁移到weblogic10.3出现的问题。
Unable to access the selected application.
Exception in AppMerge flows' progression
经过分析是web.xml文件的问题。如果将servlet的配置去掉就能正常部署。
每个servlet下面需要添加<load-on-startup>1</load-on-startup>
六、连接池配置问题
spring的datasource在tomcat里配置为:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/dsName</value>
</property>
</bean>
在weblogic里需要配置为
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>dsName</value>
</property>
</bean>
七、 getServletContext()
改为
getServletConfig().getServletContext()
八、NullPointerException in initSessionInfo()
仅在IE出现, 在FF里没有问题, 需要以下2步才能撤掉消除这个问题
1. 设置Server, Protocols页面里的HTTP, 去掉Enable Keepalives的复选框
2. 在WEB-INF目录下新建一个 weblogic.xml 文件, 内容如下:
<?xml version="1.0" encoding="GBK"?>
<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90">
<session-descriptor>
<cookie-name>jsessionid1</cookie-name>
</session-descriptor>
</weblogic-web-app>
九、围绕字符集的问题汇总
web.xml
问题描述:
文件本身是UTF-8格式时, Tomcat能够解析, Weblogic启动失败, 提示: VALIDATION PROBLEMS WERE FOUND
解决方法:
用window的记事本打开web.xml,另存为ANSI格式( 由于当前是中文操作系统, 所以实际编码为GBK )
同时修改第一行字符集信息: <?xml version="1.0" encoding="UTF-8"?>
由UTF-8改为GBK, 否则Weblogic还是解析失败.
比较奇怪的是UltraEdit竟然也能识别encoding设置,如果文件是ANSI格式,而encoding设置为UTF-8,则中文显示为乱码! 设成GBK就好了
提示: Eclipse里所有xml格式默认为UTF-8, 并且不支持encoding设置, 所以打开GBK的web.xml还是乱码
所以Weblogic不支持web.xml为UTF-8格式是个缺陷?
这个问题也许与web.xml的version="2.4"有关? 可以把相关的配置改成Servlet2.3的格式试试(待测试)
总之用Weblogic有小麻烦
jsp, include, 与 pageEncoding
问题描述:
在main.jsp中include另外一个part.jsp页面, 这些文件都是UTF-8格式的,
并且设置 <%@ page contentType="text/html;charset=UTF-8" %> ,则pageEncoding应该默认与contentType里的charset相同, 为UTF-8
如果被include的part.jsp的文件格式是UTF-8的, 则不管是哪种include方式, 都会导致最终输出的页面里多出"FF FE"字节,
这些不能显示的字符后面如果是<div> <table> 等html的块元素, 会导致IE等浏览器先换行处理, 再显示<div> <table>
最终的效果就是页面多出一些奇怪的空行.
2个问题在Tomcat和Weblogic里都有.
解决方法:
把被include的part.jsp文件改为GBK格式的(用记事本打开,另存为,指定ANSI即可)
但是这样会引起中文乱码的问题, 需要设置 part.jsp 的 pageEncoding="GBK" 才行!
设置pageEncoding又会引起下面的问题:
main.jsp和part.jsp在Weblogic里, 有些情况(还不太明确)不能同时配置 pageEncoding
十、使用log4j的问题
tomcat应用直接发布到weblogic上出现错误:Cannot set web app root system property when WAR file is not expanded。
WebLogic自身也包含对Log4j的支持,在打包部署(.war)的时候,会和Spring的org.springframework.web.util.Log4jConfigListener有冲突。
解决方法之一就是把log4j的配置直接放到classpath下,log4j在web.xml下的相关配置,由于系统需要webAppRootKey这个参数,
所以web.xml中需要加入:
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>webapp.root</param-value>
</context-param>
十一、struts、ibatis等开源软件的配置文件中的相对路径问题。
比如ibatis中的配置:
<sqlMap resource="../../WEB-INF/config/ibatis/ibatis-common.xml"/>
类似于这样的相对路径写法在tomcat下是没有任何问题的,但是weblogic是不认的,会报找不到文件。
简单的解决办法就是配置文件放到classpath下。
十二、页面默认编码问题
我们都知道在页面上写类似于下面这样的代码来设置浏览器编码:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
十三、部署web项目到weblogic中,启动weblogic出现异常:
<2011-9-7 上午06时05分24秒 GMT> <Error> <J2EE> <BEA-160197> <Unable to load descriptor D:\bea\user_projects\domains\base_domain\.\autodeploy\dataSwitching/WEB-INF/web.xml of module dataSwitching. The error is weblogic.descriptor.DescriptorException: Unmarshaller failed
at weblogic.descriptor.internal.MarshallerFactory$1.createDescriptor(MarshallerFactory.java:147)
at weblogic.descriptor.DescriptorManager.createDescriptor(DescriptorManager.java:280)
at weblogic.descriptor.DescriptorManager.createDescriptor(DescriptorManager.java:248)
at weblogic.application.descriptor.AbstractDescriptorLoader2.getDescriptorBeanFromReader(AbstractDescriptorLoader2.java:749)
......原来是web.xml中web-app版本的原因,改回2.4即可
十四、Caused by: java.lang.ClassNotFoundException:org.joda.time.LocalDate
原因:缺少joda-time-2.1.jar
这个包在tomcat下不需要加载,在weblogic下会报缺少这个文件,把这个jar包加进去即可
十五、Caused by: java.lang.ClassNotFoundException:org.apache.el.ExpressionFactoryImpl
原因:缺少jasper-el.jar
由于项目在tomcat下运行时,默认会加载tomcat的lib的jar包,因此运行正常,迁移到weblogic下后,就会报缺少el的jar包,加进去即可;
十六、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配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app
PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN"
"http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
十七、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
十八、WebLogic基础知识
一个域可以包括多个服务器,应用程序依赖于某个服务器,通过部署-〉某应用程序-〉目标 来配置
wl_server是weblogic默认域,通过开始菜单-〉Bea products->tools->Weblogic Server来启动
要创建自己的域,则可以通过开始菜单-〉Bea products->tools->Configuration wizard来创建
登录地址:http://localhost:7001/console/login/LoginForm.jsp
登录用户密码:weblogic/weblogic
1.部署war之后,测试时发生错误:
Error 503--Service Unavailable
From RFC 2068 Hypertext Transfer Protocol -- HTTP/1.1:
.....
解决办法:一般是在刚刚激活更改后,就进行测试,还需要将该应用程序启动,状态为“活动”之后再测试就可以了。
2.连接池测试时出错:
Warning! Connectivity to backend database not verified. This is either because required connection pool attribute "TestConnectionsOnReserve" has not been enabled, or an invalid value has been specified for attribute "TestTableName". Please check the server log for more details..
配置连接缓冲池,在“高级”中选中“保留时测试连接”即可。此时需要先激活更改再进行测试。否则还会报错。
3.jdbc jndi错误:
javax.naming.NameNotFoundException: Unable to resolve 'jdbc_fbysss. Resolved ''; remaining name 'jdbc_fbysss'
首先要在控制台中点击左边的控制栏中的服务->JDBC新建一个数据源,数据源名称无所谓,jndi name一定要注意,比如取名叫jdbc_fbysss,而且,jdbc源必须依赖于一个server。否则无法启动。
对于Spring项目,修改applicationContext.xml的dataSource,(Tomcat的连接池在这里就不需要了)。
<!-- 数据源缓冲池 --> <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc_fbysss"/><!--两者要一样-->
<property name="resourceRef">
<value>false</value>
</property>
</bean>
4.xml校验错误
(1)hbm.xml
org.dom4j.DocumentException: unknown protocol: platform. Nested exception: unknown protocol: platform
这个经检查是workshop导出时 ,hbm.xml文件生成错误。修改过来就好了
(2)struts-config.xml
正式部署时出现异常:
ERROR Digester []: Parse Error at line 2 column
15: Document root element "struts-config", must match DOCTYPE root "null".
org.xml.sax.SAXParseException: Document root element "struts-config", must match
DOCTYPE root "null".
需要在struts-config.xml中第二行加入<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
5.ServletApi实现不一致情况
发现一个奇怪的现象,tomcat中,一个servlet的子类,如果没有声明init方法,会自动执行父类的init方法,而weblogic不会。
解决办法是显式声明init,super.init();
6.莫名其妙空指针错误
完整错误信息:
java.io.FileNotFoundException: F:\bea\wlserver_10.0\samples\domains\workshop\servers\cgServer\tmp\_WL_user\prj_fbysss\mlh5uz\war (拒绝访问。)
at java.io.FileInputStream.open(Ljava.lang.String;)V(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at workshop.util.filesystem.file.WlFileSystem.getInputStream(WlFileSyste
m.java:148)
at workshop.util.filesystem.FS.getInputStream(FS.java:262)
at javelin.jsp.JspParser.readStaticInclude(JspParser.java:3261)
at javelin.jsp.JspParser.parseStaticInclude(JspParser.java:3198)
at javelin.jsp.JspParser.processImplicitIncludes(JspParser.java:3289)
at javelin.jsp.JspParser.jspParse(JspParser.java:703)
at javelin.jsp.JspParser._parse(JspParser.java:504)
at javelin.jsp.JspParser.parse(JspParser.java:497)
at javelin.jsp.JspAnalyzer.parseFile(JspAnalyzer.java:113)
at javelin.jsp.JspAnalyzer.parse(JspAnalyzer.java:101)
at javelin.ProxySourceFile.parse(ProxySourceFile.java:117)
at javelin.SourceFile.getAst(SourceFile.java:542)
at javelin.SourceFile.getAst(SourceFile.java:516)
at javelin.ProxySourceFile.codeGen(ProxySourceFile.java:215)
at javelin.SourceFile.codeGen(SourceFile.java:310)
at javelin.client.ClientUtilsImpl$CodeGenJob.run(ClientUtilsImpl.java:11
05)
at javelin.client.Job.performJob(Job.java:81)
at javelin.client.ThreadPool$WorkerThread.run(ThreadPool.java:215)
<2008-8-23 下午07时15分11秒 CST> <Error> <HTTP> <BEA-101017> <[weblogic.servlet.
- appName: prj_fbysss, name: 'prj_fbysss', context-path: '/prj_fbysss] Root cause of ServletException.
java.lang.NullPointerException
at javelin.jsp.JspAnalyzer.parse(JspAnalyzer.java:104)
at javelin.ProxySourceFile.parse(ProxySourceFile.java:117)
at javelin.SourceFile.getAst(SourceFile.java:542)
at javelin.SourceFile.getAst(SourceFile.java:516)
at javelin.ProxySourceFile.codeGen(ProxySourceFile.java:215)
Truncated. see log file for complete stacktrace
>
最后发现是web.xml中<include-coda/>一句不对,去掉就好了,很怪异。
<taglib>
<taglib-uri>http://www.sss.com/select</taglib-uri>
<taglib-location>/WEB-INF/tlds/select.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://www.sss.com/tree</taglib-uri>
<taglib-location>/WEB-INF/tlds/tree.tld</taglib-location>
</taglib>
<!--web 项目配置-->
<jsp-property-group>
<description>
WEB项目配置
</description>
<display-name>JSPConfiguration</display-name>
<url-pattern>*.jsp</url-pattern>
<el-ignored>false</el-ignored>
<page-encoding>gbk</page-encoding>
<scripting-invalid>false</scripting-invalid>
<!--这句居然引起webloic错误!!!! include-coda/-->
</jsp-property-group>
</jsp-config>
7.类冲突问题
(1)JSTL解析失败
index.jsp:1:1: validator 类 "org.apache.taglibs.standard.tlv.JstlCoreTLV" 失败,出现如下异常: "java.lang.ClassCastException: weblogic.xml.jaxp.RegistrySAXParserFactory"。
< contentType="text/html;charset=gbk" language="java"%>
项目属性-〉项目构面中的设置将记录在.setting/org.eclipse.wst.common.project.facet.core.xml文件中。
最后是把prefer-web-inf-classes设置为false就可以了。
(2)HQL语句执行失败
org.springframework.orm.hibernate3.HibernateQueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken
这种情况是包版本冲突,必须设置prefer-web-inf-classes设置为true。
这样一来,有的包需要true,有的需要false,怎么办?Weblogic的确够恶心的。JSTL的包都已经放webapp下了,设置prefer-web-inf-classes设置为ture还不行,只好采取以下稍显麻烦的方法:
在workshop开发环境下,启动的服务器目录是
F:\bea\wlserver_10.0\samples\domains\workshop\bin
修改启动脚本startWebLogic.cmd
找到set CLASSPATH=%SAVE_CLASSPATH%,在后面加入
@REM sss added
set PRE_CLASSPATH=%WL_HOME%\server\lib\antlr-2.7.6rc1.jar;
set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH%
其中,antlr-2.7.6rc1.jar包需要拷贝到F:\bea\wlserver_10.0\server\lib下。
正式发布的时候,需要修改对应域目录下的启动脚本
比如f:\bea\user_projects\domains\fbysssDomain\bin\startWebLogic.cmd
8.部署问题
部署时出现如下错误:
<2008-8-23 下午07时37分42秒 CST> <Warning> <Deployer> <BEA-149124> <
Failures were detected while initiating redeploy task for application 'prj_fbysss'. Error is: '
[Deployer:149163]The domain edit lock is owned by another session in non-exclusi
ve mode - this deployment operation requires exclusive access to the edit lock a
nd hence cannot proceed.'>
解决:进入http://localhost:7001/console,释放配置,再次部署即可。
注:更新war:必须在删除该应用,并激活更改之后才能覆盖。
但是用war方式,获取资源路径的方法和tomcat不同,存在臭名昭著的getRealPath等问题,移植困难,所以用目录方式部署比较好。
具体方法:先把war解压,然后在weblogic控制台里面选择目录部署。
十九、用XmlHttp获取xml,responseXml为空
解决方法:
在web.xml中加入
<mime-mapping>
<extension>xml</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
二十、用SmartUpload下载文件时出错
出错信息:
java.io.IOException: 文件名、目录名或卷标语法不正确。
at java.io.WinNTFileSystem.canonicalize0(Native Method)
at java.io.Win32FileSystem.canonicalize(Win32FileSystem.java:395)
at java.io.File.getCanonicalPath(File.java:531)
at weblogic.servlet.internal.WebAppServletContext.getRealPath
(WebAppServletContext.java:666)
at com.jspsmart.upload.SmartUpload.isVirtual(SmartUpload.java:1180)
Truncated. see log file for complete stacktrace
解决方法:自己写了一个Servlet来下载文件,代码如下:
在tomcat下,浏览器读取该页面时会自动编码设置为unicode,
但是weblogic不行,必须在web.xml中设置:
<mime-mapping>
<extension>html</extension>
<mime-type>text/html;charset=UTF-8</mime-type>
</mime-mapping>
十三、读取当前应用的资源文件问题
另外,在应用中使用IO来读取本应用中的文件时,tomcat下是没有任何问题的,但是在weblogic下会有些问题,要尽量使用ServletContext.getResourceAsStream来读取文件。
十四、 Tomcat和WebLogic在使用连接池处理CLOB字段的诡异问题
为了符合业务部门的要求,需要将一些数据存储到CLOB字段中,当然,在日常的生产系统上当然是使用ConnectionPool来连接数据库的了,代码段如下:
public Connection getJdbcConnection(){
Connection conn = null;
try {
conn = getJdbcTemplate().getDataSource().getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
处理代码段如下:
......
oracle.sql.CLOB clobtt = null;
if(rs.next()){
clobtt = (oracle.sql.CLOB)rs.getClob(1);
Writer wr = clobtt.getCharacterOutputStream();
char[] b = obj.getValue1().toCharArray();
......
运行结果:
ClassCastException
奇怪了,难道是我的Driver用错了(这时我使用的是Tomcat DataSource),查看了common/lib下的driver,classes12.jar!没错呀。。等一下,好像不对,怎么才1.04MB,这个是Oracle9i R1的Driver,当然是不包括oracle.sql.CLOB对象的,更换(classes12.jar是1.14MB的)
写了一段测试,代码如下(连接方式采用DriverManager方式测试):
public Connection getConnectionDB(){
Connection conn = null;
try {
Class.forName("XXXXXXXXXXXXXXXXX");
conn = DriverManager.getConnection("XXXXXXX","XXXXX","XXXXX");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return conn;
}
哈哈,结果是成功的,然后更换到生产机上运行。。。晕,使用DataSource还是ClassCastException,查找了一翻。。还是一样的问题,难道是tomcat不支持CLOB方式?更换至weblogic,同样问题。。。
我有点晕了,通过如下方式进行Debug捕捉,看看到底对象中是什么:
Object o = rs.getClob(1);
结果是oracle.sql.CLOB,晕了。。那怎么会在使用DataSource的情况下就ClassCastException呢?使用DriverManager却不会发生?查看一下WEB-INF\lib下的包,没有任何问题
考虑再三,首先先要解决问题,由于项目开发中使用tomcat(开发人员的机器太烂,没办法在开发环境也用weblogic),QA和现场均使用weblogic DataSource,而且客户现场不可以在配制文件中出现密码明文、考虑到performance,所以使用DriverManager是不现实的
实现代码如下:
......
//获取J2EE服务器类型 1-tomcat 0-weblogic
String r = ((Gparam)getParamByCode("1050")).getValue1();
Connection conn = null;
if("1".equals(r)){//tomcat
conn = jdbcManager.getConnectionDB();
}else if("0".equals(r)){//weblogic
conn = jdbcManager.getJdbcConnection();
}
conn.setAutoCommit(false);
ResultSet rs = null;
String sql=getLparamSQL(obj,editMode);
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.executeUpdate();
sql = "SELECT VALUE1,VALUE2 FROM LPARAM WHERE KEY = "+obj.getKey()+" AND USERID="+obj.getUserid()+" FOR UPDATE";
stmt = conn.prepareStatement(sql);
rs= stmt.executeQuery();
if("1".equals(r)){//tomcat
oracle.sql.CLOB clobtt = null;
if(rs.next()){
clobtt = (oracle.sql.CLOB)rs.getClob(1);
Writer wr = clobtt.getCharacterOutputStream();
char[] b = obj.getValue1().toCharArray();
wr.write(b);
wr.flush();
wr.close();
clobtt = (oracle.sql.CLOB)rs.getClob(2);
wr = clobtt.getCharacterOutputStream();
b = obj.getValue2().toCharArray();
wr.write(b);
wr.flush();
wr.close();
}
}else if("0".equals(r)){//weblogic
weblogic.jdbc.vendor.oracle.OracleThinClob clobtt = null;
if(rs.next()){
clobtt = (weblogic.jdbc.vendor.oracle.OracleThinClob)rs.getClob(1);
Writer wr = clobtt.getCharacterOutputStream();
char[] b = obj.getValue1().toCharArray();
wr.write(b);
wr.flush();
wr.close();
clobtt = (weblogic.jdbc.vendor.oracle.OracleThinClob)rs.getClob(2);
wr = clobtt.getCharacterOutputStream();
b = obj.getValue2().toCharArray();
wr.write(b);
wr.flush();
wr.close();
}
}
rs.close();
stmt.close();
conn.commit();
conn.close();
......
在weblogic环境下使用weblogic.jdbc.vendor.oracle.OracleThinClob专用方式来进行处理,在tomcat环境下使用driverManager,然后通过系统配置文件进行开关式配置,用来解决2个矛盾的问题
通过以上处理来看,解决事情还是要多动脑精,不能死钻。。。
关于JDBC Driver的这个疑问还有待深入研究。。。等待下文
十四、Servlet 规范使用2.5,不能使用3.0
十五、Spring配置文件不能使用通配符,有多个配置文件必须分成多个来写。(web.xml中contextConfigLocation的配置)
十六、Struts2 Convention插件的配置要添加以下两项:
<constant name="struts.convention.action.fileProtocols" value="jar,zip" />
<constant name="struts.convention.action.includeJars" value=".* /_wl_cls_gen.* jar(!/) " />
二十七、在源码的根路径添加一个名为“META-INF”的目录,里面随便添加一个文件。
二十八、使用CXF时,注意web.xml的开头部分只能如下,去除xmlns:xsi、xsi:schemaLocation等声明。
<web-app xmlns="">
二十九、使用CXF时,删除以下包:
jaxb-impl-*.jar
xml-apis-*.jar
## serializer-*.jar
## xalan-*.jar
三十、字符集问题
在Jsp中pageEncoding选择GBK,但是content中的charset一定是utf-8。然后原有的工程的WEB-INF下建立weblogic.xml文件。文件头可以到安装目录的例子里去找。然后加上
<wls:charset-params>
<wls:input-charset>
<wls:resource-path>/*</wls:resource-path>
<wls:java-charset-name>utf-8</wls:java-charset-name>
</wls:input-charset>
</wls:charset-params>
并且将web.xml中spring的转码设为GBK
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果这样,可能出现一些js文件失效的情况,可以将js文件用记事本打开,然后另存为utf-8编码,就能解决了。
三十一、加载HIbernate文件时,出现错误。HqlToken的错误。
原因是antlr-2.7.6.jar与weblogic的自带的冲突引起的。解决办法在weblogic.xml里加入
<wls:container-descriptor>
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
</wls:container-descriptor>
让weblogic优先使用工程自带的包,这个方法要加在字符集之前。
三十二、系统集成了DWR,会在使用时报CSRF错误。
需要在web.xml文件里关于dwr的配置修改为如下
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<ini
解决:将web.xml中
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/applicationContext*.xml
</param-value>
</context-param>
修改成:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value> classpath*:applicationContext.xml,classpath*:applicationContext_time.xml,classpath*:applicationContext-security.xml
</param-value>
</context-param>
原因:weblogic解析web.xml时不支持通配符
二、ClassNotFoundException: org.hibernate.hql.ast.HqlToken
解决:将antlr-2.7.6.jar放到C:\oracle\Middleware\jrockit_160_17_R28.0.0-679\jre\lib\ext下面
原因:Weblogic默认先加载EJB-QL parser,存在重名类.将antlr-2.7.6.jar放于weblogic所用jdk的lib/ext下
可先加载antlr-2.7.6.jar
三、报CSRF错误
解决:将以前web.xml关于dwr的servlet配置:
<servlet>
<servlet-name >dwr</servlet-name>
<servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
修改成
<servlet>
<servlet-name >dwr</servlet-name>
<servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>allowScriptTagRemoting</param-name>
<param-value>true</param-value>
</init-param> <load-on-startup>1</load-on-startup>
</servlet>
原因:dwr跨域访问的安全问题,weblogic加强了安全机制
四、因为用的struts2 convention 零配置,启动后运行报no action found error 错误,找不到action;
解决:这个问题比较麻烦:
首先要更新struts2.1.6到struts2.2.1.
另外:将struts.xml加入
<constant name="struts.convention.action.fileProtocols" value="jar,zip" />
<constant name="struts.convention.action.includeJars" value=".*?/_wl_cls_gen.*?jar(!/)?" />
最后:将src文件夹加入META-INF文件夹。里面放入任意文件,目的是让其它编译到classes文件夹下
原因:我也说不清楚,参考的网友的这篇文章:http://aaa5131421.iteye.com/blog/558463
最后,为了达到最好的性能,将以前的dbcp换成weblogic的数据源吧。
配置方法很简单:
weblogic中首先创建一个数据源例如:jndi名称为:jdbc/db301,数据源的连接池初始大小以最大数根据实际情况作出配置
然后在applicationContext.xml中加入
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/db301" />,替换以前的datasource配置
五、tomcat程序迁移到weblogic10.3出现的问题。
Unable to access the selected application.
Exception in AppMerge flows' progression
经过分析是web.xml文件的问题。如果将servlet的配置去掉就能正常部署。
每个servlet下面需要添加<load-on-startup>1</load-on-startup>
六、连接池配置问题
spring的datasource在tomcat里配置为:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/dsName</value>
</property>
</bean>
在weblogic里需要配置为
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>dsName</value>
</property>
</bean>
七、 getServletContext()
改为
getServletConfig().getServletContext()
八、NullPointerException in initSessionInfo()
仅在IE出现, 在FF里没有问题, 需要以下2步才能撤掉消除这个问题
1. 设置Server, Protocols页面里的HTTP, 去掉Enable Keepalives的复选框
2. 在WEB-INF目录下新建一个 weblogic.xml 文件, 内容如下:
<?xml version="1.0" encoding="GBK"?>
<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90">
<session-descriptor>
<cookie-name>jsessionid1</cookie-name>
</session-descriptor>
</weblogic-web-app>
九、围绕字符集的问题汇总
web.xml
问题描述:
文件本身是UTF-8格式时, Tomcat能够解析, Weblogic启动失败, 提示: VALIDATION PROBLEMS WERE FOUND
解决方法:
用window的记事本打开web.xml,另存为ANSI格式( 由于当前是中文操作系统, 所以实际编码为GBK )
同时修改第一行字符集信息: <?xml version="1.0" encoding="UTF-8"?>
由UTF-8改为GBK, 否则Weblogic还是解析失败.
比较奇怪的是UltraEdit竟然也能识别encoding设置,如果文件是ANSI格式,而encoding设置为UTF-8,则中文显示为乱码! 设成GBK就好了
提示: Eclipse里所有xml格式默认为UTF-8, 并且不支持encoding设置, 所以打开GBK的web.xml还是乱码
所以Weblogic不支持web.xml为UTF-8格式是个缺陷?
这个问题也许与web.xml的version="2.4"有关? 可以把相关的配置改成Servlet2.3的格式试试(待测试)
总之用Weblogic有小麻烦
jsp, include, 与 pageEncoding
问题描述:
在main.jsp中include另外一个part.jsp页面, 这些文件都是UTF-8格式的,
并且设置 <%@ page contentType="text/html;charset=UTF-8" %> ,则pageEncoding应该默认与contentType里的charset相同, 为UTF-8
如果被include的part.jsp的文件格式是UTF-8的, 则不管是哪种include方式, 都会导致最终输出的页面里多出"FF FE"字节,
这些不能显示的字符后面如果是<div> <table> 等html的块元素, 会导致IE等浏览器先换行处理, 再显示<div> <table>
最终的效果就是页面多出一些奇怪的空行.
2个问题在Tomcat和Weblogic里都有.
解决方法:
把被include的part.jsp文件改为GBK格式的(用记事本打开,另存为,指定ANSI即可)
但是这样会引起中文乱码的问题, 需要设置 part.jsp 的 pageEncoding="GBK" 才行!
设置pageEncoding又会引起下面的问题:
main.jsp和part.jsp在Weblogic里, 有些情况(还不太明确)不能同时配置 pageEncoding
十、使用log4j的问题
tomcat应用直接发布到weblogic上出现错误:Cannot set web app root system property when WAR file is not expanded。
WebLogic自身也包含对Log4j的支持,在打包部署(.war)的时候,会和Spring的org.springframework.web.util.Log4jConfigListener有冲突。
解决方法之一就是把log4j的配置直接放到classpath下,log4j在web.xml下的相关配置,由于系统需要webAppRootKey这个参数,
所以web.xml中需要加入:
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>webapp.root</param-value>
</context-param>
十一、struts、ibatis等开源软件的配置文件中的相对路径问题。
比如ibatis中的配置:
<sqlMap resource="../../WEB-INF/config/ibatis/ibatis-common.xml"/>
类似于这样的相对路径写法在tomcat下是没有任何问题的,但是weblogic是不认的,会报找不到文件。
简单的解决办法就是配置文件放到classpath下。
十二、页面默认编码问题
我们都知道在页面上写类似于下面这样的代码来设置浏览器编码:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
十三、部署web项目到weblogic中,启动weblogic出现异常:
<2011-9-7 上午06时05分24秒 GMT> <Error> <J2EE> <BEA-160197> <Unable to load descriptor D:\bea\user_projects\domains\base_domain\.\autodeploy\dataSwitching/WEB-INF/web.xml of module dataSwitching. The error is weblogic.descriptor.DescriptorException: Unmarshaller failed
at weblogic.descriptor.internal.MarshallerFactory$1.createDescriptor(MarshallerFactory.java:147)
at weblogic.descriptor.DescriptorManager.createDescriptor(DescriptorManager.java:280)
at weblogic.descriptor.DescriptorManager.createDescriptor(DescriptorManager.java:248)
at weblogic.application.descriptor.AbstractDescriptorLoader2.getDescriptorBeanFromReader(AbstractDescriptorLoader2.java:749)
......原来是web.xml中web-app版本的原因,改回2.4即可
十四、Caused by: java.lang.ClassNotFoundException:org.joda.time.LocalDate
原因:缺少joda-time-2.1.jar
这个包在tomcat下不需要加载,在weblogic下会报缺少这个文件,把这个jar包加进去即可
十五、Caused by: java.lang.ClassNotFoundException:org.apache.el.ExpressionFactoryImpl
原因:缺少jasper-el.jar
由于项目在tomcat下运行时,默认会加载tomcat的lib的jar包,因此运行正常,迁移到weblogic下后,就会报缺少el的jar包,加进去即可;
十六、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配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app
PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN"
"http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
十七、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
十八、WebLogic基础知识
一个域可以包括多个服务器,应用程序依赖于某个服务器,通过部署-〉某应用程序-〉目标 来配置
wl_server是weblogic默认域,通过开始菜单-〉Bea products->tools->Weblogic Server来启动
要创建自己的域,则可以通过开始菜单-〉Bea products->tools->Configuration wizard来创建
登录地址:http://localhost:7001/console/login/LoginForm.jsp
登录用户密码:weblogic/weblogic
1.部署war之后,测试时发生错误:
Error 503--Service Unavailable
From RFC 2068 Hypertext Transfer Protocol -- HTTP/1.1:
.....
解决办法:一般是在刚刚激活更改后,就进行测试,还需要将该应用程序启动,状态为“活动”之后再测试就可以了。
2.连接池测试时出错:
Warning! Connectivity to backend database not verified. This is either because required connection pool attribute "TestConnectionsOnReserve" has not been enabled, or an invalid value has been specified for attribute "TestTableName". Please check the server log for more details..
配置连接缓冲池,在“高级”中选中“保留时测试连接”即可。此时需要先激活更改再进行测试。否则还会报错。
3.jdbc jndi错误:
javax.naming.NameNotFoundException: Unable to resolve 'jdbc_fbysss. Resolved ''; remaining name 'jdbc_fbysss'
首先要在控制台中点击左边的控制栏中的服务->JDBC新建一个数据源,数据源名称无所谓,jndi name一定要注意,比如取名叫jdbc_fbysss,而且,jdbc源必须依赖于一个server。否则无法启动。
对于Spring项目,修改applicationContext.xml的dataSource,(Tomcat的连接池在这里就不需要了)。
<!-- 数据源缓冲池 --> <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc_fbysss"/><!--两者要一样-->
<property name="resourceRef">
<value>false</value>
</property>
</bean>
4.xml校验错误
(1)hbm.xml
org.dom4j.DocumentException: unknown protocol: platform. Nested exception: unknown protocol: platform
这个经检查是workshop导出时 ,hbm.xml文件生成错误。修改过来就好了
(2)struts-config.xml
正式部署时出现异常:
ERROR Digester []: Parse Error at line 2 column
15: Document root element "struts-config", must match DOCTYPE root "null".
org.xml.sax.SAXParseException: Document root element "struts-config", must match
DOCTYPE root "null".
需要在struts-config.xml中第二行加入<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
5.ServletApi实现不一致情况
发现一个奇怪的现象,tomcat中,一个servlet的子类,如果没有声明init方法,会自动执行父类的init方法,而weblogic不会。
解决办法是显式声明init,super.init();
6.莫名其妙空指针错误
完整错误信息:
java.io.FileNotFoundException: F:\bea\wlserver_10.0\samples\domains\workshop\servers\cgServer\tmp\_WL_user\prj_fbysss\mlh5uz\war (拒绝访问。)
at java.io.FileInputStream.open(Ljava.lang.String;)V(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at workshop.util.filesystem.file.WlFileSystem.getInputStream(WlFileSyste
m.java:148)
at workshop.util.filesystem.FS.getInputStream(FS.java:262)
at javelin.jsp.JspParser.readStaticInclude(JspParser.java:3261)
at javelin.jsp.JspParser.parseStaticInclude(JspParser.java:3198)
at javelin.jsp.JspParser.processImplicitIncludes(JspParser.java:3289)
at javelin.jsp.JspParser.jspParse(JspParser.java:703)
at javelin.jsp.JspParser._parse(JspParser.java:504)
at javelin.jsp.JspParser.parse(JspParser.java:497)
at javelin.jsp.JspAnalyzer.parseFile(JspAnalyzer.java:113)
at javelin.jsp.JspAnalyzer.parse(JspAnalyzer.java:101)
at javelin.ProxySourceFile.parse(ProxySourceFile.java:117)
at javelin.SourceFile.getAst(SourceFile.java:542)
at javelin.SourceFile.getAst(SourceFile.java:516)
at javelin.ProxySourceFile.codeGen(ProxySourceFile.java:215)
at javelin.SourceFile.codeGen(SourceFile.java:310)
at javelin.client.ClientUtilsImpl$CodeGenJob.run(ClientUtilsImpl.java:11
05)
at javelin.client.Job.performJob(Job.java:81)
at javelin.client.ThreadPool$WorkerThread.run(ThreadPool.java:215)
<2008-8-23 下午07时15分11秒 CST> <Error> <HTTP> <BEA-101017> <[weblogic.servlet.
- appName: prj_fbysss, name: 'prj_fbysss', context-path: '/prj_fbysss] Root cause of ServletException.
java.lang.NullPointerException
at javelin.jsp.JspAnalyzer.parse(JspAnalyzer.java:104)
at javelin.ProxySourceFile.parse(ProxySourceFile.java:117)
at javelin.SourceFile.getAst(SourceFile.java:542)
at javelin.SourceFile.getAst(SourceFile.java:516)
at javelin.ProxySourceFile.codeGen(ProxySourceFile.java:215)
Truncated. see log file for complete stacktrace
>
最后发现是web.xml中<include-coda/>一句不对,去掉就好了,很怪异。
<taglib>
<taglib-uri>http://www.sss.com/select</taglib-uri>
<taglib-location>/WEB-INF/tlds/select.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://www.sss.com/tree</taglib-uri>
<taglib-location>/WEB-INF/tlds/tree.tld</taglib-location>
</taglib>
<!--web 项目配置-->
<jsp-property-group>
<description>
WEB项目配置
</description>
<display-name>JSPConfiguration</display-name>
<url-pattern>*.jsp</url-pattern>
<el-ignored>false</el-ignored>
<page-encoding>gbk</page-encoding>
<scripting-invalid>false</scripting-invalid>
<!--这句居然引起webloic错误!!!! include-coda/-->
</jsp-property-group>
</jsp-config>
7.类冲突问题
(1)JSTL解析失败
index.jsp:1:1: validator 类 "org.apache.taglibs.standard.tlv.JstlCoreTLV" 失败,出现如下异常: "java.lang.ClassCastException: weblogic.xml.jaxp.RegistrySAXParserFactory"。
< contentType="text/html;charset=gbk" language="java"%>
项目属性-〉项目构面中的设置将记录在.setting/org.eclipse.wst.common.project.facet.core.xml文件中。
最后是把prefer-web-inf-classes设置为false就可以了。
(2)HQL语句执行失败
org.springframework.orm.hibernate3.HibernateQueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken
这种情况是包版本冲突,必须设置prefer-web-inf-classes设置为true。
这样一来,有的包需要true,有的需要false,怎么办?Weblogic的确够恶心的。JSTL的包都已经放webapp下了,设置prefer-web-inf-classes设置为ture还不行,只好采取以下稍显麻烦的方法:
在workshop开发环境下,启动的服务器目录是
F:\bea\wlserver_10.0\samples\domains\workshop\bin
修改启动脚本startWebLogic.cmd
找到set CLASSPATH=%SAVE_CLASSPATH%,在后面加入
@REM sss added
set PRE_CLASSPATH=%WL_HOME%\server\lib\antlr-2.7.6rc1.jar;
set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH%
其中,antlr-2.7.6rc1.jar包需要拷贝到F:\bea\wlserver_10.0\server\lib下。
正式发布的时候,需要修改对应域目录下的启动脚本
比如f:\bea\user_projects\domains\fbysssDomain\bin\startWebLogic.cmd
8.部署问题
部署时出现如下错误:
<2008-8-23 下午07时37分42秒 CST> <Warning> <Deployer> <BEA-149124> <
Failures were detected while initiating redeploy task for application 'prj_fbysss'. Error is: '
[Deployer:149163]The domain edit lock is owned by another session in non-exclusi
ve mode - this deployment operation requires exclusive access to the edit lock a
nd hence cannot proceed.'>
解决:进入http://localhost:7001/console,释放配置,再次部署即可。
注:更新war:必须在删除该应用,并激活更改之后才能覆盖。
但是用war方式,获取资源路径的方法和tomcat不同,存在臭名昭著的getRealPath等问题,移植困难,所以用目录方式部署比较好。
具体方法:先把war解压,然后在weblogic控制台里面选择目录部署。
十九、用XmlHttp获取xml,responseXml为空
解决方法:
在web.xml中加入
<mime-mapping>
<extension>xml</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
二十、用SmartUpload下载文件时出错
出错信息:
java.io.IOException: 文件名、目录名或卷标语法不正确。
at java.io.WinNTFileSystem.canonicalize0(Native Method)
at java.io.Win32FileSystem.canonicalize(Win32FileSystem.java:395)
at java.io.File.getCanonicalPath(File.java:531)
at weblogic.servlet.internal.WebAppServletContext.getRealPath
(WebAppServletContext.java:666)
at com.jspsmart.upload.SmartUpload.isVirtual(SmartUpload.java:1180)
Truncated. see log file for complete stacktrace
解决方法:自己写了一个Servlet来下载文件,代码如下:
在tomcat下,浏览器读取该页面时会自动编码设置为unicode,
但是weblogic不行,必须在web.xml中设置:
<mime-mapping>
<extension>html</extension>
<mime-type>text/html;charset=UTF-8</mime-type>
</mime-mapping>
十三、读取当前应用的资源文件问题
另外,在应用中使用IO来读取本应用中的文件时,tomcat下是没有任何问题的,但是在weblogic下会有些问题,要尽量使用ServletContext.getResourceAsStream来读取文件。
十四、 Tomcat和WebLogic在使用连接池处理CLOB字段的诡异问题
为了符合业务部门的要求,需要将一些数据存储到CLOB字段中,当然,在日常的生产系统上当然是使用ConnectionPool来连接数据库的了,代码段如下:
public Connection getJdbcConnection(){
Connection conn = null;
try {
conn = getJdbcTemplate().getDataSource().getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
处理代码段如下:
......
oracle.sql.CLOB clobtt = null;
if(rs.next()){
clobtt = (oracle.sql.CLOB)rs.getClob(1);
Writer wr = clobtt.getCharacterOutputStream();
char[] b = obj.getValue1().toCharArray();
......
运行结果:
ClassCastException
奇怪了,难道是我的Driver用错了(这时我使用的是Tomcat DataSource),查看了common/lib下的driver,classes12.jar!没错呀。。等一下,好像不对,怎么才1.04MB,这个是Oracle9i R1的Driver,当然是不包括oracle.sql.CLOB对象的,更换(classes12.jar是1.14MB的)
写了一段测试,代码如下(连接方式采用DriverManager方式测试):
public Connection getConnectionDB(){
Connection conn = null;
try {
Class.forName("XXXXXXXXXXXXXXXXX");
conn = DriverManager.getConnection("XXXXXXX","XXXXX","XXXXX");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return conn;
}
哈哈,结果是成功的,然后更换到生产机上运行。。。晕,使用DataSource还是ClassCastException,查找了一翻。。还是一样的问题,难道是tomcat不支持CLOB方式?更换至weblogic,同样问题。。。
我有点晕了,通过如下方式进行Debug捕捉,看看到底对象中是什么:
Object o = rs.getClob(1);
结果是oracle.sql.CLOB,晕了。。那怎么会在使用DataSource的情况下就ClassCastException呢?使用DriverManager却不会发生?查看一下WEB-INF\lib下的包,没有任何问题
考虑再三,首先先要解决问题,由于项目开发中使用tomcat(开发人员的机器太烂,没办法在开发环境也用weblogic),QA和现场均使用weblogic DataSource,而且客户现场不可以在配制文件中出现密码明文、考虑到performance,所以使用DriverManager是不现实的
实现代码如下:
......
//获取J2EE服务器类型 1-tomcat 0-weblogic
String r = ((Gparam)getParamByCode("1050")).getValue1();
Connection conn = null;
if("1".equals(r)){//tomcat
conn = jdbcManager.getConnectionDB();
}else if("0".equals(r)){//weblogic
conn = jdbcManager.getJdbcConnection();
}
conn.setAutoCommit(false);
ResultSet rs = null;
String sql=getLparamSQL(obj,editMode);
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.executeUpdate();
sql = "SELECT VALUE1,VALUE2 FROM LPARAM WHERE KEY = "+obj.getKey()+" AND USERID="+obj.getUserid()+" FOR UPDATE";
stmt = conn.prepareStatement(sql);
rs= stmt.executeQuery();
if("1".equals(r)){//tomcat
oracle.sql.CLOB clobtt = null;
if(rs.next()){
clobtt = (oracle.sql.CLOB)rs.getClob(1);
Writer wr = clobtt.getCharacterOutputStream();
char[] b = obj.getValue1().toCharArray();
wr.write(b);
wr.flush();
wr.close();
clobtt = (oracle.sql.CLOB)rs.getClob(2);
wr = clobtt.getCharacterOutputStream();
b = obj.getValue2().toCharArray();
wr.write(b);
wr.flush();
wr.close();
}
}else if("0".equals(r)){//weblogic
weblogic.jdbc.vendor.oracle.OracleThinClob clobtt = null;
if(rs.next()){
clobtt = (weblogic.jdbc.vendor.oracle.OracleThinClob)rs.getClob(1);
Writer wr = clobtt.getCharacterOutputStream();
char[] b = obj.getValue1().toCharArray();
wr.write(b);
wr.flush();
wr.close();
clobtt = (weblogic.jdbc.vendor.oracle.OracleThinClob)rs.getClob(2);
wr = clobtt.getCharacterOutputStream();
b = obj.getValue2().toCharArray();
wr.write(b);
wr.flush();
wr.close();
}
}
rs.close();
stmt.close();
conn.commit();
conn.close();
......
在weblogic环境下使用weblogic.jdbc.vendor.oracle.OracleThinClob专用方式来进行处理,在tomcat环境下使用driverManager,然后通过系统配置文件进行开关式配置,用来解决2个矛盾的问题
通过以上处理来看,解决事情还是要多动脑精,不能死钻。。。
关于JDBC Driver的这个疑问还有待深入研究。。。等待下文
十四、Servlet 规范使用2.5,不能使用3.0
十五、Spring配置文件不能使用通配符,有多个配置文件必须分成多个来写。(web.xml中contextConfigLocation的配置)
十六、Struts2 Convention插件的配置要添加以下两项:
<constant name="struts.convention.action.fileProtocols" value="jar,zip" />
<constant name="struts.convention.action.includeJars" value=".* /_wl_cls_gen.* jar(!/) " />
二十七、在源码的根路径添加一个名为“META-INF”的目录,里面随便添加一个文件。
二十八、使用CXF时,注意web.xml的开头部分只能如下,去除xmlns:xsi、xsi:schemaLocation等声明。
<web-app xmlns="">
二十九、使用CXF时,删除以下包:
jaxb-impl-*.jar
xml-apis-*.jar
## serializer-*.jar
## xalan-*.jar
三十、字符集问题
在Jsp中pageEncoding选择GBK,但是content中的charset一定是utf-8。然后原有的工程的WEB-INF下建立weblogic.xml文件。文件头可以到安装目录的例子里去找。然后加上
<wls:charset-params>
<wls:input-charset>
<wls:resource-path>/*</wls:resource-path>
<wls:java-charset-name>utf-8</wls:java-charset-name>
</wls:input-charset>
</wls:charset-params>
并且将web.xml中spring的转码设为GBK
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果这样,可能出现一些js文件失效的情况,可以将js文件用记事本打开,然后另存为utf-8编码,就能解决了。
三十一、加载HIbernate文件时,出现错误。HqlToken的错误。
原因是antlr-2.7.6.jar与weblogic的自带的冲突引起的。解决办法在weblogic.xml里加入
<wls:container-descriptor>
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
</wls:container-descriptor>
让weblogic优先使用工程自带的包,这个方法要加在字符集之前。
三十二、系统集成了DWR,会在使用时报CSRF错误。
需要在web.xml文件里关于dwr的配置修改为如下
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<ini