SSH中的error解决

来源:互联网 发布:千与千寻 知乎 编辑:程序博客网 时间:2024/05/18 01:31

1 org.hibernate.PropertyNotFoundException: Could not find a getter for admin adminId in class Xxx.

首先解析一下这个错误“在类Xxx中没有找到 admin adminId”。

原因:在SQL Server 中不小心把adminId写成了adminadminId,导致在用Myeclipse反向工程时,.hbm.xml映射文件中id为Xxx的类的属性名写错,与model中的getXxx方法不相匹配。


2 struts中的action的class要与applicationContext中的Bean的id 相对应,而不是完整的类名。

参考网站:CSDN


Caused by: Action class [login] not found

详细:

严重: Exception starting filter struts2
Unable to load configuration. - action - file:/D:/workspace/Ecplipse/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/GoogleMapFWZJW/WEB-INF/classes/struts.xml:7:38
 at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)
 at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:360)
 at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:403)

。。。。。。。

Caused by: Action class [login] not found - action - file:/D:/workspace/Ecplipse/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/GoogleMapFWZJW/WEB-INF/classes/struts.xml:7:38
 at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyAction(XmlConfigurationProvider.java:405)
 at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:355)
 at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:460)


对应的struts.xml文件如下:

<struts>
    <package name="example" namespace="" extends="struts-default">
        <action name="Login" class="login">
            <result>/loginResult.jsp</result>
            <result name="input">/login.jsp</result>
        </action>
    </package>
</struts>


其中的class=“login”的login对应spring的applicationContext.xml里的id为login的bean。

如果你的struts.xml和applicationContext.xml都配置正确,还报以上的错误,那么可以判断你的项目缺少jar包:struts2-spring-plugin-2.0.11.1.jarcommons-fileupload-1.2.1.jarcommons-io-1.3.2.jar

导入这些jar包就行了,这些jar可以在struts-2.1.6的lib下找到。

小编原因是没有导入struts2-spring-plugin-2.0.11.1.jar,该 jar包可以在CSDN下载 不需要积分处下载。


参考文章:博客园


error : java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I

!!!这是一个让小编调了27个小时的Bug。。。


原因:
(1)包冲突 
struts2中的antlr-2.7.2.jar(位置:在Myeclipse——>windows——>preference,输入struts,回车搜索,点击struts2,在右边栏中便可以看到,文件夹地址:“myeclipse\configuration\org.eclipse.osgi\bundles\105\1\.cp\data\2.1\core”,这个包也是来自Myeclipse,但所有的项目共享一个)与Hurbernet中的antlr-2.7.6.jar(位置:在WebRoot——>WEB-INF——>lib中可以找到哦,这个包是在项目中的,虽然来自Myeclipse,但每个项目都会有一个)

(2)struts2中的jar包版本过低
struts2中的antlr-2.7.2.jar与Hurbernet中的antrl-2.7.6相比,版本过低。

解决方法:
原理将struts中的antrl-2.7.2.jar换成Hurbernet中的antrl-2.7.6.jar,并将“antrl-2.7.6.jar”改名为 
“antrl-2.7.2.jar”
过程:
   1.删除struts2中的antrl-2.7.2.jar。
a.从桌面上Remove struts2中的antrl-2.7.2.jar : Window ——>Preference——>输入struts,点击struts2进入,选中"antrl-2.7.2.jar",Remove。
b.从文件夹中彻底删除(最好剪切到另一个地方,以防出现错误,再将其还原即可,小编是这样处理的,在core文件夹下建立一个名为“备份”的文件夹,将antrl-2.7.2.jar剪切到其中,即便最终成功了也不要将其删除
打开Myeclipse安装目录下的“myeclipse\configuration\org.eclipse.osgi\bundles\105\1\.cp\data\2.1\core”,将其中的antrl-2.7.2.jar剪切到“备份”文件夹中。
   2.将Hurbernet中的antrl-2.7.6.jar复制到struts2的Core文件夹中,并重命名为"antrl-2.7.2.jar"。
a.打开项目下的WebRoot——>WEB-INF——>lib,找到其中的antrl-2.7.6.jar,右键该jar包,按照location属性中的地址找到该jar包,复制到struts2中的Core文件夹中,重命名为"antrl-2.7.2.jar"。
b.将新antrl-2.7.2.jar添加到struts2的桌面上,Windows——Preference——>struts,点击struts2,Add JAR/ZIP,选中新antrl-2.7.2.jar,确定,Apply,OK。
建议重启MyEclipse,然后运行项目,若成功了,恭喜您,您已经成功解决了该Bug,若还是老样子,不要灰心,您只需一步了——清空tomcat服务器的缓存,如下第3步:
  3.关闭Myeclipse,按照Tomcat服务器如何清理缓存,删除work下的“Catalina”文件夹即可。然后!打开Myeclipse,运行您的项目吧大笑,祝您好运~
参考网址:
CSDN,重点参考2楼和10楼。
 辅助:
博客园
51CTO技术论坛
CSDN
Tomcat服务器如何清理缓存_百度经验

5 Line:209-com/opensymphony/xwork2/spring/SpingObjectFactory.java:209:-1

 Line: 209 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:209:-1
原因两个:
1.lib中多导入包的大原因:去掉struts2-spring-plugin-2.1.8包即可,因为没有用到spring。
2.还有的原因是用spring了,却没加监听器,在web.xml里面加上
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext*.xml</param-value>
 </context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
参考网站:网易博客



org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'TeacherDao' is defined

解决这类问题的原理:(No Bean named ' ' id defined,不要管他是不是Dao类的Bean还是自定义的Bean,原理完全一样。)
就是到Spring 的配置文件即applicationContext.xml文件中查看相应的Bean是否出错。

   :你说你看过了?你说检查n次了没错呀,Dao文件和相应的Dao类 的Bean定义都是Myeclipse自己生成的怎么会出错呢?那就是你自己出错了,原因在哪儿呢?ref =" ",看看你是不是有个ref="...Dao",而文件里只有个"xxDAO"的Bean,它当然不对应了。

仔细看,6目录中的红色部分“AO”,在“DAO”这三个字母中,在Bean中究竟是"AO"还是"ao"可一定要注意啦!

由于这里改动的是 Spring的配置文件,所以改完之后需要重启服务器才会生效。

7 org.hibernate.QueryException: could not resolve property: userTypeId of: com.tcm.model.User [from com.tcm.model.User as model where model.userTypeId= ?]

解析:你可能会说你已经检查过model了,其中的属性就是userTypeId,可怎么还会错呢?
原因:你检查的不是地方,看前面的"org.hibernate.QueryException",这说明该错误与数据库的查询有关,那就要回到数据库了,在Console窗口的下方有一条”at com.tcm.model.UserDAO.findByProperty(UserDAO.java:85)“,找到相应的行数,有如下两句:
  String queryString = "from User as model where model." 
          + propertyName + "=?";
 Query queryObject = getSession().createQuery(queryString);“,
学过SQL Server的你应该明白了,findByProperty("propertyName",value);,此处的"propertyName"要与数据库中的一致。而Myeclipse在进行逆向工程时为了不导致冲突,把我数据库中的"ID"改成了"Id",So。。。就这样了。

8 org.hibernate.exception.SQLGrammarException: could not execute query

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'User' 附近有语法错误。

错误原因:user是MS SQL2005保留关键字,在user.hbm.xml中table="user"就有问题 
解决方法:
 1.重新命名数据库表 
          2.user.hbm.xml 修改为table="[user]"
参考网站:ITeye技术网站

9 sessionFactory' is not writable or has an invalid setter method.

在进行逆向工程之后,Dao方法可能继承了一个名为BaseHibernateDAO的类,而该类实现了一个自己生成的接口。
解决方法:删除DAOBaseHibernateDAO实现的接口,并让BaseHibernateDAO方法继承HibernateDaoSupport类。

10 Illegal attempt to associate a collection with two open sessions

小编出错的代码:

原因:在service中存在两个不同的org.hibernate.Session实例都同时引用了同一个collection对象,一个是load(),一个是saveOrUpdate().
解决办法:
法1:hibernate3.0以上可以使用merge()来合并两个session中的同一对。

为了保证可以及时提交数据,可以再添加两句:

法2:        session.delete(session.load(Course.class, persistentInstance.getCourseId()));如下图:


参考网站:开源中国
开源中国社区

11 使用delete方法之后,没出异常但也没把数据库中的数据删去

原因:没出异常就说明您的删除方法是正确的,只是没有立即提交到SQL Server。
应在使用delete方法之后,立即进行session.flush();

正确的删除方式如下图:
Service方法中:

DAO方法中:


12 使用xxxDAO.findById()查不到数据

注意:findById()只能查询名为“Id”的字段。

主键是其他名字怎麽办?
1.修改主键名字。
2.可以采用findByProperty(" "," ")。

参考网站:APICloud。

13 java.lang.NoSuchMethodException: com.student.action.ManageStudentAction.getUnSelectedCourse()

原因有很多,小编将逐个添加,读者可参照检查自己的程序:(下面的讲解将以上面的错误为例)
(1)方法( getUnSelectedCourse() )必须是public的。

14 org.hibernate.PropertyValueException: not-null property references a null or transient value: com.tcm.model.Admin.users

错误解读:Admin类的属性users是非空属性,可是没有给该属性赋值。
我的Admin继承了Users类,在 model中呈现的就是Users的一个实例作为Admin类的一个属性。


15 Admin继承了Users,如何向数据库中插入一个Admin?

未采用如下方法时,曾出现了几种错误:
1.不能插入值为null的'loginName',尽管已经设置了loginName属性,admin.setLoginName(loginName)。
2. org.hibernate.PropertyValueException: not-null property references a null or transient value

这个有点麻烦,所以小编便以自己的实例来解释一下,仅作参考:
(1)小编的概念数据模型(pdm),实体管理员(Admin)继承了实体用户(Users),同时继承了Users的主键userId 作为自己的主键。

这里注意:
小编早前曾以登录名(loginName Variable characters(50))作为主键,可总是出现错误:“不能插入值为null的'loginName'”,尽管在插入前的确进行了loginName的赋值admin.setLoginName(loginName)。若有知道原因的朋友,还请给予解释,不胜感激
所以迫不得已,小编取消了登录名(loginName)的主键作用,并将其设置为允许为空。另增一Integer类型的主键userId,并将其设置为自增类型(即标志规范)。具体如下图:

(2)逆向工程生成的model:
Admin:

注意:此处Admin实体中不仅含有Users实体的全体属性,还有一个Users的的实例直接作为其属性(不知道为什么,感觉有些多此一举)。

(3)映射文件:
Users.hbm.xml:

主键生成策略设置为"native",将会根据底层数据库的能力,自动从identity、sequence、hilo中选择一个,灵活性更强。

Admin.hbm.xml:


"assigned"表示:在插入数据的时候主键由用户自己添加,hibernate也不管。所以在向数据库中插入Admin之前,我们要对admin的userId人为地进行赋值。

关于主键生成策略的参考文章:Linux公社-Linux系统门户网站

(4)Service中插入功能的代码:

public String registNewAdmin(String loginName, String password,String userName, String telephone, int userTypeId, int departmentNo) {// TODO Auto-generated method stubList users_list = null;users_list = usersDAO.findByProperty("loginName", loginName);if (users_list != null && users_list.size() >= 1)return "用户名已存在";else{//先插入UserUsers users = new Users();users.setLoginName(loginName);users.setPassword(password);users.setUserType(new UserType(1));users.setUserName(userName);users.setTelephone(telephone);//System.out.println("登录名 : " + loginName);//System.out.println("登录名2:" + users.getLoginName());usersDAO.save(users);users_list = usersDAO.findByProperty("loginName", loginName);users = (Users) users_list.get(0);//System.out.println("ID = " + users.getUserId());Department department = null;List department_list = null;department_list = departmentDAO.findByProperty("departmentNo",departmentNo);if (department_list == null || department_list.size() <= 0)return "院系编码错误";department = (Department) department_list.get(0);Admin admin = new Admin();admin.setUserId(users.getUserId());admin.setLoginName(users.getLoginName());admin.setPassword(users.getPassword());admin.setUserName(users.getUserName());admin.setUserTypeId(users.getUserType().getUserTypeId());admin.setTelephone(users.getTelephone());admin.setUsers(users);admin.setDepartment(department);adminDAO.save(admin);}return "";}
在上面的代码中注意三个地方:

A:在向数据库的子类表(Admin)中插入记录之前,必须保证父类表(Users)中含有相应的记录,若父类表(Users)中没有,要先向父类表(Users)中插入数据。

B:子类表中要显示设置的属性包括:从父类中继承的所有属性(包括父类的主键userId),子类Model中的父类实例(private Users users)。(感觉userId设置了两遍,可都不能缺少,不知道为什么),如下图:


注意:

admin.setUsers(users);一句中的uses是从数据库中取出的,包含了数据库(或hibernate)赋予的userId的值:


(5)DAO中向数据库中插入记录的代码:


好了,这就算完成了。增设一个userId确实是不得已的办法,若有更好的办法,请留言评论,不胜感激。


16 从JSP向Aciton传汉字时,传到Action中就变成了乱码

解决方法:
在Action中设置一下字符串的编码格式,如下:
if(personName.equals(new String(personName.getBytes("GB2312"), "GB2312"))){  personName = new String(personName.getBytes("GB2312"),"utf-8");   }else  if(personName.equals(new String(personName.getBytes("iso-8859-1"), "iso-8859-1"))){  personName = new String(personName.getBytes("iso-8859-1"),"utf-8");                 }else if(personName.equals(new String(personName.getBytes("UTF-8"), "UTF-8"))){  personName = new String(personName.getBytes("UTF-8"),"utf-8");   }else if(personName.equals(new String(personName.getBytes("GBK"), "GBK"))){  personName = new String(personName.getBytes("GBK"),"utf-8");   } 

小编的Action中有一变量String personName,在从JSP传到Action中后,先进行上面的处理,然后再使用personName。

如下是整个方法:
public String modifyTeacher() {try {if(personName.equals(new String(personName.getBytes("GB2312"), "GB2312"))){  personName = new String(personName.getBytes("GB2312"),"utf-8");   }else  if(personName.equals(new String(personName.getBytes("iso-8859-1"), "iso-8859-1"))){  personName = new String(personName.getBytes("iso-8859-1"),"utf-8");                 }else if(personName.equals(new String(personName.getBytes("UTF-8"), "UTF-8"))){  personName = new String(personName.getBytes("UTF-8"),"utf-8");   }else if(personName.equals(new String(personName.getBytes("GBK"), "GBK"))){  personName = new String(personName.getBytes("GBK"),"utf-8");   } System.out.println("action personName = " + personName);if (manageAdminIService.modifyTeacher(loginName, password,userName, personName, sexName, personAge, telephone,teacherNum, departmentName)) {request.setAttribute("modifyTeacher_result", "success");} else {request.setAttribute("modifyTeacher_result", "error");}return "modifyTeacher_success";} catch (Exception e) {// TODO: handle exceptione.printStackTrace();request.setAttribute("result", "error");return ERROR;}}

参考网站:CSDN博客

17 jsp退出系统如何清除session

新建一个页面logout.jsp,页面中写
  <body>    <%    session.invalidate();     response.sendRedirect("index.jsp");     %>  </body>
点击链接跳转到该页面。

18 错误名称:Batch update returned unexpected row count from update [0]

表Son继承自表Father,表Father 中id为Integer也为自增类型,表Son 以继承自Father的id为主键。
这时在.hbm.xml中Son的主键生成策略            <generator class="native" />为native,将其改为assigned。 


19 错误名称 : could not initialize proxy - no Session

首先,这是一个超级经典的错误。
原因:延迟加载、session已关闭。。。。其实,小编也是一知半解。
解决方法:将多表查询中的类的映射文件.hbm.xml中的<class>元素的lazy属性设置为 false。

20 错误名称:Invalid property 'sessionFactory' of bean class 

详细描述:org.springframework.beans.factory.BeanCreationException: Error creating bean with name  'ProductDAO' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'sessionFactory' of bean class [sdkd.com.eb.model.ProductDAO]: Bean property 'sessionFactory' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? 'ProductDAO' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'sessionFactory' of bean class [sdkd.com.eb.model.ProductDAO]: Bean property 'sessionFactory' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

解决方法:让DAO方法继承自HibernateDaoSupport。

21 关键词 hibernate LazyInitializationException collectionsession Set size() 

主题 : org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:: sdkd.com.eb.model.Commonuser.orderforms, no session or session was closesdkd.com.eb.model.Commonuser.orderforms, no session or session was closed

详细描述:
atorg.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection
.java:380)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(
AbstractPersistentCollection.java:372)
at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:119)
at org.hibernate.collection.PersistentSet.size(PersistentSet.java:162)

解决方法:
 <set name="orderforms" inverse="true">            <key>                <column name="user_Id" />            </key>            <one-to-many class="sdkd.com.eb.model.Orderform" /> </set>
将set 元素的lazy属性设置为false。

22 org.hibernate.LazyInitializationException: could not initialize proxy - no Session

at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:132)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
at sdkd.com.eb.model.Orderstate_$$_javassist_5.getStateName(Orderstate_$$_javassist_5.java)

原因:
在<many-to-on>中这错误很常见,字面意义就是不能被初始化,因为session已经关闭了。

简单理解就是因为,你使用了lazy=true,这样hibernate在从数据库中调数据的时候是不会把关联的对象查出来的,而是保存一个获取值得方法,在你使用getXXX()调用的时候,hiberante会利用这个保存的方法去从数据库中取数据。而往往我们在jsp页面中使用getXXX()准备展示数据的时候,session早已经在dao中就关闭了,我们该如何解决这种异常呢?

解决方法:
把lazy设成false,最2的办法,但是最简单,简单就是美嘛,也依然会有很多再使用这个方式再解决类似问题。


参考网站:http://blog.csdn.net/elfenliedef/article/details/6011892

23 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'orderstate0_.order_Id' in 'field list'

原因:在表orderstate0 中没有找到列order_Id。
小编使用了Hibernate框架,在重新设计了表后没有及时更新DAO,于是便出现了上述问题,即DAO与数据库表不匹配。

参考网站:http://stackoverflow.com/questions/27797806/com-mysql-jdbc-exceptions-jdbc4-mysqlsyntaxerrorexception-unknown-column-day0


24 采用Hinernate 操作数据库时,如何才能使数据库表中某些字段的默认值生效?

将映射文件.hbm.xml中与那些字段相对应的property标签的insert属性设置为false。表示,若sql语句中未向这些字段插入数据就采用数据库中的默认值。

25 $.ajax访问SSH中的Action访问不到,原因是访问的url错误

话不多说,直接上图。


0 0
原创粉丝点击