配置SSH过程中遇到的几个问题

SSH是现在常用的几个Java EE框架,第一个S即 Struts ,第二个S即 Spring,H则是Hibernate。关于SSH具体的安装配置和使用网上有很多教程,这里不再赘述,下面主要讲的是最近本人在使用SSH时所遇到的坑。

Hibernate

问题1

1
 Caused by: org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given, please either disable second level cache or set correct region factory class name to property hibernate.cache.region.factory_class (and make sure the second level cache providerhibernate-infinispanfor exampleis available in the classpath).

原因在于hibernate4.0在hibernate.cfg.xml配置二级缓存和hibernate3.3有所不同,本例子用的是 Hibernate-core.4.3.6.Final,实际上从4.0开始就不一样,二级缓存的配置对比如下所示:

  • 4.0以上配置如下:
1
2
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
  • 3.3配置如下:
1
2
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="cache.provider_class ">org.hibernate.cache.EhCacheProvider</property>

但是如果仅仅是修改上述配置的话,还是会出错,因为要使用二级缓存的话,还需要引用相应的jar包,即 hibernate-release-4.3.6.Final\lib\optional\ehcache 下的 jar 包也要拷贝到 lib 中,否则会出现 Unable to create requested service [org.hibernate.cache.spi.RegionFactory] 的错误。

问题2

1
!MESSAGE Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.

修改 workspace.metadata.plugins\org.eclipse.wst.server.core\servers.xml文件。

1
2
3
4
5
6
<servers>
<server hostname="localhost" id="JBoss v5.0 at localhost" name="JBoss v5.0 at localhost" runtime-id="JBoss v5.0" server-type="org.eclipse.jst.server.generic.jboss5" server-type-id="org.eclipse.jst.server.generic.jboss5" start-timeout="1000" stop-timeout="15" timestamp="0">
<map jndiPort="1099" key="generic_server_instance_properties" port="8090"
serverAddress="127.0.0.1" serverConfig="default"/>
</server>
</servers>

把 start-timeout=”45” 改为 start-timeout=”100” 或者更长。实际部署时每个人遇到的问题可能都会有所不同,按它的出错提示信息仔细分析一般都可以找到原因。

整合SSH

问题1

部署时页面总是出现404错误,最后发现没有引入spring-web.*.jar。

问题2

整合SSH实验中,进行单元测试时总是出现 * java.lang.ClassCastException: com.hui.ssh.model.User$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy的异常,仔细阅读代码并无错误,后来发现原来有两个javassist的jar包,一个是是从struts2中引入,一个是从hibernate中引入,删掉比较旧的javassist jar包即可。

问题3

遇到问题:org.hibernate.LazyInitializationException: could not initialize proxy - no Session
这是由于前端的jsp通过调用后台HibernateTemplate一个实例的Load方法,仅仅获得的是一个类的代理,在其执行前,session已经关闭(事务边界设在service层)。

  • 解决方法1:换用get方法,查询数据库数据。(不方便取多个数据)
1
2
3
4
5
6
7
8
9
10
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
  • 使用filter。在web.xml中 加入,并且要放在struts2的filter前。

  • 使用openSessionInViewInterceptor