SSH框架整合时总是会出现一些这样或那这样的问题
作此记录以备后用
今天导入了一个新的项目,打算部署一下看看,但是出现了以下问题
1.Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>
原因:
这个异常是hibernate包中的cglib.jar与spring中的cglib.jar版本不一致导致的.
解决办法:
移除其中一个即可.
2.Could not initialize class net.sf.cglib.proxy.Enhancer
原因:
cglib-x.x.jar重复了
解决办法:
把一个去掉,保留cglib-nodep-x.x_x.jar
3.在使用注解配置Spring AOP过程中发现两个error:
(1) error at ::0 can't find referenced pointcut
原因:
网上的说法是,如果使用的spring 2.0的版本中的的aspectjrt.jar和jdk6不兼容。
解决办法:
网上的解决办法主要有以下两种:
a.更换新版本的aspectjrt
b.也有的说自己的环境是JDK7 + Spring 3.6.6,因此不是aspectjrt.jar问题。最初我也尝试使用不同版本的aspectjrt.jar文件,但都不起作 用。于是我怀疑可能是aspectjweaver.jar的问题,因为使用的版本较低(1.5的)。
于是下载了新版本aspectjweaver-1.6.12替换掉旧的,第1个错误就解决了,而且classpath中没包含aspectjrt.jar。
(2) error at ::0 formal unbound in point
原因:
再来说下第2个错误,贴下我的代码:
- @After("testBeanExecution()")
- public void afterCall(Joinpoint jp) {
- System.out.println("After");
- }
修改为:
- @After("testBeanExecution()")
- public void afterCall() {
- System.out.println("After");
- }
4.当使用struts拦截器的时候,访问正常,但是总是传递参数的时候,后台接收不到参数
原因:
理论上来讲LoginInterceptor 继承了 AbstractInterceptor 继承了默认拦截器,应该就不用添加默认拦截器,但是不知道是struts的bug还是源码看的有问题,总之加上该信息 就解决了此问题
解决办法:
添加以下红色部分
<!-- 拦截器 -->
<interceptors>
<!-- 登录验证 -->
<interceptor name="loginVerify"
class="com.*.*.interceptors.LoginInterceptor">
</interceptor>
<interceptor-stack name="verify">
<interceptor-ref name="loginVerify"></interceptor-ref>
<!-- 必须要添加默认拦截器,不然会报错的。。。。 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
5.配置Spring事务的时候报错 Element 'beans:beans' cannot have character [children], because the type's content type is element-only.
原因:
从网上找的一个例子,复制粘贴代码的时候应该是存在乱码
解决办法:
删除所有的空格,自己手动格式化,换行
6.配置Hibernate的表关联的时候报错如下
[VIDEO] ERROR [main] org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(212) | Unsuccessful: alter table table_sms_info add index FKDAD82D25D9164AC7 (device_id), add
constraint FKDAD82D25D9164AC7 foreign key (device_id) references table_device_info (id)
[VIDEO] ERROR [main] org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(213) |Can't create table 'kamailio.#sql-3762_53a76' (errno: 150)
从上面看来错误,刚一出现感到各种没有头绪啊,因为从配置来看,我的好几个关联都是同样的一对多,多对一配置
SmsInfo.java
/**
* @author 作者姓名 king
* @version 创建时间:May 10, 2013 2:04:05 PM 类说明
*/
@Entity
@Table(name = "table_sms_info")
public class SmsInfo
{
private Integer id;
private DeviceInfo deviceInfo;
@ManyToOne(cascade=CascadeType.MERGE,fetch=FetchType.LAZY)
@JoinColumn(name="device_id")
public DeviceInfo getDeviceInfo()
{
return deviceInfo;
}
@Id
@GeneratedValue
public Integer getId()
{
return id;
}
省略。。。
}
/**
* @author 作者姓名 king
* @version 创建时间:Mar 5, 2013 11:22:30 AM 类说明 设备信息
*/
@Entity
@Table(name = "table_device_info")
public class DeviceInfo implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private Set<SmsInfo> smsInfos = new HashSet<SmsInfo>();
@OneToMany(mappedBy = "deviceInfo", cascade = CascadeType.REFRESH, targetEntity = SmsInfo.class,fetch=FetchType.LAZY)
@JoinColumn(name="device_id")
public Set<SmsInfo> getSmsInfos()
{
return smsInfos;
}
省略。。。。
}
原因:
原来是因为用了表关联,但是由于关联字段不会出现在Bean结构中,由于别人建立的数据库,把smsInfo对应表中的device_id的格式写成了char型,而应该是int型,通过mysql的报错信息errno: 150是解决问题的关键
解决办法:
将数据库关联字段改成一致,并经过网上查询,貌似类型一致 但是长度不一致的话也会导致此问题,具体没有实验,有兴趣的可以试试看...
7.java.lang.NoClassDefFoundError: org/slf4j/helpers/NOPLoggerFactory
原因:
主要原因是hibernate-distribution-3.3.2.GA中的带有的slf4j-api-1.5.8和最新下载的slf4j-1.6.1不兼容造成的
解决办法:
下载一个slf4j-1.5.8包就解决问题了
8.java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
原因:
缺少jar包
解决办法:
下载slf4j-nop.jar
9.java.lang.UnsupportedClassVersionError: Bad version number in .class file
原因:
JDK版本与项目工程所用版本不同
解决办法:
更换编译器JDK版本
10. java.lang.NoClassDefFoundError: org/jboss/mx/util/PropertyAccess
原因:
缺少类库
解决办法:
去掉J2EE1.4;但是可能因此引起一些其他的错误;因此将其换成java EE5 libsers了
11.a different object with the same identifier value was already associated with the session
当出现a different object with the same identifier value was already associated with the session时,一般是因为在hibernate中同一个session里面有了两个相同标识但是是不同实体。
有如下几种解决方案:
(1)使用session.clean(),如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作,有可能会报出"Found two representations of same collection"异常。
(2)使用session.refresh(object),当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为该方法是从hibernate的session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下。
(3)session.merge(object),Hibernate里面自带的方法,推荐使用。