`

最近一些J2EE bug总结

阅读更多
JavaEE项目中bug总结

一.
java.lang.NullPointerException  at org.apache.jsp.index_jsp._jspInit....[/b]
这个bug是我在转myeclipse项目到eclipse-jee / springSource中遇到的错误

原因是拷贝了一个jsp-api.jar的包到WEB-INF/lib目录下,删除这个文件即可,估计是拷贝的这个文件跟tomcat有冲突。
这里还有一点要提的是.classpath中
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v6.0">
<attributes>
<attribute name="owner.project.facets" value="jst.web"/>
</attributes>
</classpathentry>
如果没有则要加上。一般都是自动生成的。


二.
java.lang.OutOfMemoryError: GC overhead limit exceeded

这个是JDK6新添的错误类型。是发生在GC占用大量时间为释放很小空间的时候发生的,是一种保护机制。解决方案是,关闭该功能,使用—— -XX:-UseGCOverheadLimit
解释:
JDK6新增错误类型。当GC为释放很小空间占用大量时间时抛出。
一般是因为堆太小。导致异常的原因:没有足够的内存。
解决方案:
1、查看系统是否有使用大内存的代码或死循环。
2、可以添加JVM的启动参数来限制使用内存:-XX:-UseGCOverheadLimit
在linux服务器中,重启tomcat时在其.sh文件中某行加入-XX:-UseGCOverheadLimit参数即可


三.
在web网络开发时,注意发布后,在网络上总有网络爬虫去爬你的网站,所以要对“必须登录”才能看到的东西要加过滤器处理,否则你的网站会因为请求太多,而挂掉,cpu飙到100%
例如我们我们网站,里面有导出功能和后台管理功能,都是类似下面的url
http://localhost:8080/abgent/export/exportByCategory?name=Stem%20Cell 导出
http://localhost:8080/abgent/admin/product/list 后台管理
我们在后台过滤其中加如下代码
User user = (User)request.getSession().getAttribute("user");
		if (((url.indexOf("/admin/") != -1) || (url.indexOf("/export/") != -1)) 
				&& ((user != null && !StringUtils.equals(user.getType().toString(), "Manager"))
				|| user == null)) {
			
			request.getRequestDispatcher("/user/toLogin").forward(request, response);
			return;
		}


四。
设置多对多的关系时,必须设置fetch = FetchType.EAGER,LAZY不可以,总报下面的错误
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:
com.founder.core.model.Permission.roles, no session or session was closed

这个bug是我在webservice中对对象进行更改操作时遇见的

才在web.xml里面加了下面的filter,强制他们关联起来,这时就可以设置fetch = FetchType.LAZY了
<filter>
	<filter-name>hibernateFilter</filter-name>
	<filter-class>
		org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
	</filter-class>
	<init-param>
         <param-name>singleSession</param-name>
         <param-value>false</param-value>	 
        </init-param>
</filter>

<filter-mapping>
	<filter-name>hibernateFilter</filter-name>
	<url-pattern>/services/*</url-pattern>
</filter-mapping>

因为加了上面的filter,才出现了下面的错误
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in

read-only mode (FlushMode.MANUAL): Turn your
Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
这是就得必须加
<init-param>
     <param-name>singleSession</param-name>
     <param-value>false</param-value>	 
</init-param>



A cycle is detected in the object graph. This will cause infinitely deep XML

错误解决方式:在另一个po里面有与之关联的主键po对象用@XmlTransient 把它注释掉
转载http://taiwei-peng.iteye.com/category/114295?show_full=true
这就好比一个入口一样把每个po都映射了一下 我是这样解决的
这里还涉及到一对多的关系
解决方法如下:
在另一个po里面有与之关联的主键po对象用@XmlTransient 把它注释掉
这样就可以了
如果不注释会包这样的一个错
org.apache.cxf.interceptor.Fault: Marshalling Error: A cycle is detected in the object graph. This will cause

infinitely deep XML: com.tjsoft.model.sys.TBusiActivity@60310f ->

com.tjsoft.model.sys.TBusiQuestionnaire@12e18d7 -> com.tjsoft.model.sys.TBusiActivity@60310f
at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:159)
还有一个错误也是经常见到
org.apache.cxf.interceptor.Fault: Marshalling Error: com.tjsoft.module.activity.schem.LabelCount is not known

to this context
这个好像就是没有与之匹配的类
解决这个方法就是上面自定义一个类型用
@XmlElements({    
  @XmlElement(name="LabelCount",type=com.tjsoft.module.activity.schem.LabelCount.class)
})  
这个就可以解决,但是你必须把它暴露出去,也就是写一个方法返回一个自定义类型实现类可以什么都不用写
这就是我搞Webservice 遇到的难题。
分享到:
评论
1 楼 xiaomaha 2011-08-09  
ejb3.0 webservice如何处理懒加载?没有类似web.xml的东西,web项目到可以使用OpenSessionInViewFilter来处理,但EJB3.0的如何做啊?看到请回复,这个问题已经困扰多日了

相关推荐

Global site tag (gtag.js) - Google Analytics