把之前的错误笔记转移到博客上(一)
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
分析
然后,我们来看出这个错误修改的具体原因和思路
<property name="hibernate.current_session_context_class">thread</property>
首先看这段代码的用处:
让我们在某一个上下文环境(比如说当前线程)中可通过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的事务)。即改成这样:
<property name="hibernate.current_session_context_class">org.springframework.orm.hibernate5.SpringSessionContext</property>
再次深入:
我们查看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