spring 常见问题解决的参考

Spring 编程入门十大问题解答

http://www.yesky.com/105/1903605.shtml

failed to lazily initialize a collection of role: XXXXXXXX no session or session was closed

http://hi.baidu.com/kekemao1/blog/item/1b3099c4023b14ca38db4925.html

 

问题解决出自以上帖子!

 



 

Spring 编程入门十大问题解答


 

 

  

  1、如何学习Spring

  你可以通过下列途径学习spring

  (1) spring下载包中doc目录下的MVC-step-by-stepsample目录下的例子都是比较好的spring开发的例子。

  (2) AppFuse集成了目前最流行的几个开源轻量级框架或者工具 Ant,XDoclet,Spring,Hibernate(iBATIS),JUnit,Cactus,StrutsTestCase,Canoo's WebTest,Struts Menu,Display Tag Library,OSCache,JSTL,Struts

  你可以通过AppFuse源代码来学习spring

AppFuse网站:http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse

  (3)Spring 开发指南(夏昕)http://www.xiaxin.net/Spring_Dev_Guide.rar

  一本spring的入门书籍,里面介绍了反转控制和依赖注射的概念,以及springbean管理,springMVCspringhibernteiBatis的结合。

  (4) spring学习的中文论坛

  SpringFramework中文论坛(http://spring.jactiongroup.net)

  Java视线论坛(http://forum.javaeye.com)spring栏目

  2、利用Spring框架编程,console打印出log4j:WARN Please initialize the log4j system properly

  说明你的log4j.properties没有配置。请把log4j.properties放到工程的classpath中,eclipseclasspathbin目录,由于编译后src目录下的文件会拷贝到bin目录下,所以你可以把log4j.properties放到src目录下。

  这里给出一个log4j.properties的例子:

log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n


  3、出现 java.lang.NoClassDefFoundError?

  一般情况下是由于你没有把必要的jar包放到lib中。

  比如你要采用springhibernate(带事务支持的话),你除了spring.jar外还需要hibernat.jaraopalliance.jarcglig.jarjakarta-commons下的几个jar包。

http://www.springframework.org/download.html下载spring开发包,提供两种zip
spring-framework- 1.1.3 -with-dependencies.zipspring-framework-1.1.3.zip,我建议你下载spring-framework-1.1.3-with-dependencies.zip。这个zip解压缩后比后者多一个lib目录,其中有hibernatej2eedom4jaopalliancejakarta-commons等常用包。

  4java.io.FileNotFoundException: Could not open class path resource [....hbm.xml],提示找不到xml文件?

  原因一般有两个:

  (1)xml文件没有在classpath中。

  (2)applicationContext-hibernate.xml中的xml名字没有带包名。比如:

bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"
property name="dataSource"><ref bean="dataSource"/></property
property name="mappingResources"
 <list
  <valueUser.hbm.xml/value
  错,改为:
  <valuecom/yz/spring/domain/User.hbm.xml/value

 </list
/property
property name="hibernateProperties"
props
 <prop key="hibernate.dialect" net.sf.hibernate.dialect.MySQLDialect /prop

 <prop key="hibernate.show_sql"true/prop

/props

/property

/bean


  5org.springframework.beans.NotWritablePropertyException: Invalid property 'postDao' of bean class

  出现异常的原因是在application-xxx.xmlproperty name的错误。

  <property name="...."> 中name的名字是与beanset方法相关的,而且要注意大小写。

  比如

public class PostManageImpl extends BaseManage implements PostManage {
 private PostDAO dao = null;
 
public void setPostDAO(PostDAO postDAO){
  
this.dao = postDAO;
 
}
}


  那么xml的定义应该是:

bean id="postManage" parent="txProxyTemplate"
property name="target"
 <bean class="com.yz.spring.service.implement.PostManageImpl"
  <property name="postDAO"><ref bean="postDAO"/></property> 对
  <property name="dao"><ref bean="postDAO"/></property> 错
 </bean
/property
/bean


  6Spring中如何实现事务管理?

  首先,如果使用mysql,确定mysqlInnoDB类型。

  事务管理的控制应该放到商业逻辑层。你可以写个处理商业逻辑的JavaBean,在该JavaBean中调用DAO,然后把该Bean的方法纳入spring的事务管理。

  比如:xml文件定义如下:

bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

property name="transactionManager"><ref bean="transactionManager"/></property
property name="transactionAttributes"
props
prop key="save*"PROPAGATION_REQUIRED/prop
prop key="remove*"PROPAGATION_REQUIRED/prop
prop key="*"PROPAGATION_REQUIRED/prop
/props
/property
/bean

bean id="userManage" parent="txProxyTemplate"
 <property name="target"
  <bean class="com.yz.spring.service.implement.UserManageImpl"
   <property name="userDAO"><ref bean="userDAO"/></property
  </bean
 </property
/bean


  com.yz.spring.service.implement.UserManageImpl就是我们的实现商业逻辑的JavaBean。我们通过parent元素声明其事务支持。

  7、如何管理Spring框架下更多的JavaBean

  JavaBean越多,spring配置文件就越大,这样不易维护。为了使配置清晰,我们可以将JavaBean分类管理,放在不同的配置文件中。 应用启动时将所有的xml同时加载。

  比如:

  DAO层的JavaBean放到applicationContext-hibernate.xml中,商业逻辑层的JavaBean放到applicationContext-service.xml中。然后启动类中调用以下代码载入所有的ApplicationContext

String[] paths = {"com/yz/spring/dao/hibernate/applicationContext-hibernate.xml",
"com/yz/spring/service/applicationContext-service.xml"};
ctx = new ClassPathXmlApplicationContext(paths);


  8web应用中如何加载ApplicationContext

  可以通过定义web.xml,由web容器自动加载。

servlet
servlet-namecontext/servlet-name
servlet-classorg.springframework.web.context.ContextLoaderServlet/servlet-class
load-on-startup1/load-on-startup
/servlet

context-param
param-namecontextConfigLocation/param-name
param-value/WEB-INF/applicationContext-hibernate.xml/param-value
param-value/WEB-INF/applicationContext-service.xml/param-value
/context-param


  9、在spring中如何配置的log4j?

  在web.xml中加入以下代码即可。

context-param
param-namelog4jConfigLocation/param-name
param-value/WEB-INF/log4j.properties/param-value
/context-param


  10Spring框架入门的编程问题解决了,我该如何更深地领会Spring框架呢?

  这两本书你该去看看。这两本书是由Spring的作者Rod Johnson编写的。

Expert One on one J2EE Design and Development
Expert One on one J2EE Development Without EJB


  你也该看看martinfowlerInversion of Control Containers and the Dependency Injection pattern

http://www.martinfowler.com/articles/injection.html

 
  再好好研读一下spring的文档。

http://www.jactiongroup.net/reference/html/index.html(中文版,未全部翻译)

 

 

failed to lazily initialize a collection of role: XXXXXXXX no session or session was closed

 

 

 

以下有2种方法,第1种是结合SPRING,第2种是采用了拦截器

Spring+Hibernate中,     集合映射如果使用lazy="true", 当PO传到View层时, 出现未初始化session已关闭的错误,只能在dao先初始化

parent.getChilds().size();


Spring
提供Open Session In View来解决这个问题, 有两种方式
1. Interceptor

       <!--</span><span style="COLOR: rgb(0,128,0)"> =========== OpenSession In View pattern ==============</span><span style="COLOR: rgb(0,128,0)">-->
    <bean id="openSessionInViewInterceptor"
             class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="interceptors" ref="openSessionInViewInterceptor"/>
        <property name="mappings">
            <props>
               ......
            </props>
        </property>
    </bean>

2. Filter

<web-app>

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate.support.OpenSessionInViewFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>

</web-app>

2种解决方法:

Hibernate.initialize()强制加载关联对象

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值