项目一所遇到的问题摘录

来源:互联网 发布:大数据工具简单 编辑:程序博客网 时间:2024/05/08 07:55
1,整合SSH框架时,在application.xml中配 置事务,如果引入错误的事务文件,这种情 况比较难发现。
     1.1,在整合hibernate与spring时,可以 保留hibernate.cfg.xml,但application.xml必 须配置hibernate的数据源。 
     1.2,每次添加或整合一个框架就测试一 下,这样有利于后期编码的调试。
 2,如果遇到bean加载失败的错误,可能的 原因有:
        ①没有配置*.hbm.xml,,,
        ②hiber nate.cfg.xml或application.xml中没有配置*. hbm.xml,,,
        ③没有对相应的bean(如:UserServiceImpl,UserDaoImpl)进行注解。 
        ④看看dao的实现类是否有问题
3,面向接口编程,解耦强,提高代码的复用 性,Dao,Service写接口,另外写daoimpl,ser viceimpl,,,如:UserAction中注入UserService, 然后调用的是UserServiceimpl的方法,,同 样,UserServiceimpl中注入UserDao接口, 调用的是UserDaoImpl的方法,,,,,,d ao中提取出公共的增删改查的方法到baseDa o和baseDaoimpl,,,,,serviceimpl类 ,需要注解事务。 
4,在action的方法中如果调用了serviceimpl 的方法得到了数据对象(如果是非根元素), 记得用actionContext.getContext存入值栈中 ,否则在jsp中不能用OGNL表达式获取,, , 
5,在jsp表单提交中,记得检查是否需要写 入隐藏字段(特别是id),,,,,
 
6,接口编程时,如果serviceImpl继承了daoSupport而忘记实现service接口,不会报错,但在访问的时候,所有的jsp都不能用,会报         注解错误的异常
7,在注入事务的ServiceImpl中继承了其它类,如继承了DaoSupportImpl,则事务对父类的的所有方法都无效,可能导致delete(),update()等方法不能操作。
8,如果提示 session已经关闭,不能用findById()等方法时,可以在web.xml中配置OpenSessionInViewFilter来延长session的生命。
9,对于  
findById(Long id) {
if(id==null)
                    return null  ;
return (T) getSession().get(clazz, id);
             
}
         类似方法而言,一定要先判断id不等于null再执行对数据库的操作,这样比较严谨,否则如果id为空的话会抛异常。
10,action操作对象的时候要分清是model的对象,还是从数据库中得到的对象,model对象是封装了jsp中表单的信息,有些属性表单中没有。
11,
 org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here的异常。
getSessionFactory().getCurrentSession()的意思是得到当前线程绑定的session,而当前线程绑定的session是通过当前的事务产生的,如果你没有配置事务或配置事务错了的话,当前线程threadlocal中就不存在session,这样就出现no session错误。
本项目中是因为, 
 @Transactional注入在了private的方法上了!!!!!!!!!!改成public即可。
12,sessionFactory=null 导致的
sessionfactory.getcurrentsession()为空  。
 同样是事务没配置或注入好。
       》1: 
@Transactional声明的方法执行时,Spring的TransactionManager会自动Open Sesion,自动开启事务,并且将此Sesion绑定到SpringSessionContext(实际上是TransactionSynchronizationManager的ThreadLocal的Map)中..

》2:SessionFactory.getCurrentSession()方法执行时,调用SpringSessionContext.currentSession()从TransactionSynchronizationManager的上下文中查找 当前的Session
       
》3:找到后返回当前的Session,找不到,则返回HibernateException("No Sessionfound for current thread")
如果sessionFactory是Null,那可能是transactionManager没有正常构造出来,从transactionManager的配置文件来看没啥问题,Spring帮助我们生成了一个单例的transactionManager对象,通过对象名称("transactionManager")从ApplicationContext 里面的getBean方法获取。
13,
如果你createSQLQuery is not valid without active transaction,获取的session是在spring代理的上下文之外的的当前线程之中,所以此session并非事务管理器代理的那个session,不会自动开启事务。根据官方提示:第三方框架提供了基于代理(proxy)或者基于拦截器(interception)的上下文相关的会话的管理,所以把hibernate.current_session_context_class设置删除了就好了。

14,创建外键的表清空表的时候提示:
     cannot truncate a table referenced in a foreign key constraint...
     我们又不想把外键去掉,怎么办呢?
    就是说在清空表之前,执行下:
SET foreign_key_checks=0
    清空后再设置为1即可。 
15,
"javax.naming.NamingException: Cannot create resource instance
    在本项目中是因为web.xml配置了的InitServletListener ,而
InitServletListener 还没写完善。
    
监听器在web.xml中注册,InitServletListener 这个类的privilegeService注入不进来,因为在web.xml中的监听器默认不是注入到spring中的,所以只能通过反射得到applicationContext对象 。
16,用<s:iterator>嵌套循环,输出两次或多次一级循环而没有二级或以下的循环内容时,应该就是二级或以下的循环体vaule的值有误。
    还有就是display: none;把它删了。而本项目中只是因为数据库中多了一份复制的数据。
17,
ERROR LazyInitializationException:42 - failed to lazily initialize a collection of role: com.thxy.oa.domain.Privilege.children, no session or session was closed,很明显这次的no session是因为懒加载的原因,因为这里调用的privilegeService的方法操作数据库时是在监听器里的,这里的方法无法用注入和事务,监听器在web.xml已经注册过了,在web.xml中是通过反射来获取监听器的,所以在此处注解是无效的。只能把有关privilege的懒加载关掉,privilege、role和user里都有与之相关的属性,关掉即可。
18,关于权限的问题,在写好权限的基本代码(各个表,实体类,权限页面)后,可以用<s:if test="#session.user.hasPrivilegeByName(name)"> 加以判断来屏蔽无权限的链接,但是如果所有链接都如此,那会很麻烦,可以自定义标签来处理,或者可以修改<s:a></s:a>的源码,选中<s:a>标签,按F3,选 中org.apache.struts2.views.jsp.ui.AnchorTag,再navigive-openType(crtl+shift+t),查看源码,如果无法查看,则找到struts2的源码文件加进来即可。不能直接改源码(只读),应该创建一个相同的包和类,再将源码复制过来,再修改,服务器会先去查你的class文件,如果没有再去查jar包,所以这样就能覆盖jar包的源代码了。

18,    <!-- 由于权限表中没有"权限设置"这一项,所以除admin外,其它role都没有该权限,超级管理员在<s:a>的源码中被          hasPrivilegeByUrl()直接返回true,所以它什么权限都有,包括"权限设置" -->

19,如果struts.xml文件中<result></result>的内容为空,会报404错误。在加入拦截器后,如果登录后报没有权限的错误,则是权限表中没有的,如,主页,退出等功能;得在hasPrivilegeByUrl()方法中过滤这些元素。

20, <s:form action="forumManage_%{id==null?'add':'edit'}">中,如果add和edit没有加引号,会报找不到返回的错误,,还有,表单提交要加隐藏字段。

21,<s:iterator 中的status 使用方法

        1:#status.odd 是否奇数行

        2:#status.count 当前行数

        3:#status.index 当前行的序号,从0开始『#status.count=#status.index+1』

        4:#status.first 是否第一行

        5:#status.last 是否最后一行

        6:#status.modules(int) 当前行数取模

22,注意英文的?不要写成中文的?
     23,在用fckeditor的时候,记得导jar包,如果slf4j-api-1.5.2.jar与slf4j-log4j12-1.6.1.jar包版本不一致,会报slf4j的错,
            还有,在加入fckeditor的文件夹的时候,如果导别人改过的,要注意配置文件,可能会报找不到工具栏的提示,应该导原始的,再自己改一下要用的工具栏功能,比如:在fckeditor.js中改FCKConfig.CustomConfigurationsPath = FCKConfig.EditorPath + "myconfig.js"
即引用自定义的myconfig.js配置。 
            <script type="text/javascript">
$(function(){
var fck = new FCKeditor("content");  
fck.Width = "99%";
fck.Height = "100%";
fck.ToolbarSet = "bbs";   //bbs为配置文件中新增的工具栏,如果配置文件中没有自己定义的bbs,则会报找不到工具栏的提示
fck.BasePath = "${pageContext.request.contextPath}/script/fckeditor/";    //给出fckeditor.js所引用的"edit"文件夹所在的路径
//fck.Config['SkinPath'] = "${pageContext.request.contextPath}/scriipt/fckeditoreditor/skins/office2003/";
//fck.Config['SkinPath'] = "http://bbs.itcast.cn:80/widgets/fckeditor/editor/skins/office2003/";
fck.ReplaceTextarea();    //替换textarea,即在textarea中使用fck
        });
            </script>
 
    24,shift+alt+A是一个不错的快捷键

    25,图片

26,遇到PersistentObjectException: uninitialized proxy passed to save() 的错误,,,代码如下
public void save(Reply reply){
getSession().save(reply);
Topic topic = reply.getTopic();
Forum forum = topic.getForum();
//getSession().save(topic);要添加的不是这个,topic已经有了,id也有了,所以会报uninitialized proxy passed to save() 的错
//getSession().save(forum);
forum.setArticleCount(forum.getArticleCount()+1);
topic.setReplyCount(topic.getReplyCount()+1);
topic.setLastReply(reply);
topic.setLastUpdateTime(reply.getPostTime());
            
27,<s:iterator value="replyList" status="status">里面的"replyList" 忘加#了,会导致无法显示参数
28,
IllegalArgumentException in class: com.thxy.oa.domain.Forum, getter method of property: id   原码如下:
// 查询本页的数据列表,parameters为List<Forum>
List<Reply> recordList = null;
Query query = getSession().createQuery(sql);
if (parameters != null) {
for (int i = 0; i < parameters.size(); i++) {
query.setParameter(i, parameters);    //此处有错,应该改为query.setParameter(i, parameters.get(i));
}
recordList = query.setFirstResult((currentPage - 1) * pageSize)
.setMaxResults(pageSize).list();
} 

29,如何jQuery没反应,应该看看表达式有没有写错
$(document.forms[0]).append("<input type='hidden' name='currentPage' value='+"pageNum+"'>");
        此处的 value='+"pageNum+"'>",,,,,有误,应改为 value='”+pageNum+"'>",,,,还有就是el表达式不要用在struts的标签里,会报错的。
0 0
原创粉丝点击