把之前的错误笔记转移到博客上(一)


2019.1.15    21:21 引入Junit后,进行单元测试,莫名其妙报了个这样的错误 The import org.junit.Test conflicts with a type defined in the same file * 原因一:常规原因,导入的jar包相冲突 * 原因二:狗血原因,写junit测试的Java类名为Test.java   2019.1.16   13:07 控制台报错: Caused by: Unable to load configuration. - action - file:/E:/tl/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/struts2/WEB-INF/classes/struts.xml:11:82 网上查找有以下解决方法: 1.检查action的name值和url中的大小写是否相同。 2.检查action中的class的路径名和你写的类名的大小写。 3.参照struts确定是否引入不必要的jar包,引发冲突(这个不好查到)。 这些都尝试依然不行,又搞了好久最后才弄好。。。。 1.在项目webRoot下面新建一个classes文件夹,把struts.xml拖到下面,可以正常使用,启动不再报错(但这个不是根本原因), 2.清理缓存,clean项目,记住是在eclipse->project->clean这里面clean,以前我都是在server部署过的tomcat上面右键clean,导致clean不彻底,因此才导致这个错误的。。。。。。。。。。。。。。。。。。。。。。   2019.1.20   23:02 Incorrect string value: '\xE6\x9D\x8E\xE9\x9B\xB7' for column 'username' at row 1 编码不匹配导致乱码,数据库、表、表字段字符集要统一       2019.1.28   12:48 执行java类连接MySQL数据库时报错: “Communication link failure, message from server: “Can’t get hostname for your address” 解决方法: 1.在开始菜单中搜索“服务” 2.找到MySQL服务: 3.右键并修改属性,如下图所示:     2019.1.28  13:32 Eclipse本来用着没什么问题,最近更新了一下。结果发现变量名输入一半时,按住Alt+/,居然不会补全。提示“No Default Proposals”     解决方法:Window -> Preferences -> Java -> Editor -> Content Assist -> Advanced 里的「Select the proposal kinds contained in the 'default' content assist list」把Java Proposals钩上即可       2019.1.28  13:43 ·使用spring和hibernate整合+struts2整合时,服务器启动没问题,访问action时报错:   HTTP Status 500 - getFlushMode is not valid without active transaction; nested exception is org.hibernate.HibernateException: getFlushMode is not valid without active transaction           分析 然后,我们来看出这个错误修改的具体原因和思路   thread 首先看这段代码的用处: 让我们在某一个上下文环境(比如说当前线程)中可通过SessionFactory.getCurrentSession()得到同一个session   我们所知道的是,hibernate中事务是需要在dao执行sql相关语句时来手动开启的,然后底层实现代码时由getCurrentSession得到的session中可以得到transaction,所以可以正常运行   错误原因: 而spring中事务是在配置文件中配置自动开启,因为由getCurrentSession得到的session中是当前线程的session,但是当前线程中没有开启事务的代码,所以不能获transaction  。然而spring+hibernate整合必须要有活动的事务才能执行dao中的方法,这个可以从报错信息中可以看出。   解决思路: 因为我们把sessionFactory的产生放在spring配置文件中,即让服务器启动时就创建这个对象,这样的话它就被存在一个上下文环境中,即在SpringSessionContext中保存 所以我们要把绑定当前线程session改成绑定这个spring上下文环境,即设置为由spring环境管理(因为事务aop也是在spring中),这时spring中的事务配置才会起作用(当然,以前是thread上下文环境的session,而事务托管在spring上下文中,当然spring无法管理到thread上下文的session的事务)。即改成这样:   org.springframework.orm.hibernate5.SpringSessionContext   再次深入: 我们查看ThreadLocalSessionContext,JTASessionContext,ManagedSessionContext,SpringSessionContext这几个类定义发现,都实现了一个接口org.hibernate.context.spi.CurrentSessionContext它定义了单一的方法currentSession(),特定的实现用它来负责跟踪当前的上下文相关的会话。那么,线程绑定或是上下文绑定,最后都是使用实现了CurrentSessionContext接口的一个类,来跟踪session,然后我们通过这个类的对象来获得被它跟踪的session,以达到在我们定义的上下文环境中调用getCurrentSession方法获得的总是同一个session   2019.1.28  13:47 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. 分析原因   这个错误主要是因为用了Spring框架并且三个框架整合后,dao层主要用HibernateTemplate的方法对数据库进行操作,这样必须得添加事务才能不出错。   2019.2.15     14:21 Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1 1