ssh框架中遇到的问题总结

本文探讨了Spring中OpenSessionInViewFilter导致的Hibernate FlushMode问题,解释了其原理及解决方法,包括如何通过配置正确地管理事务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

错误代码1:DispatchMapping[***] does not define a handler property

在struts配置中,如果用了DispatchAction,则必须加上parameter="status"的参数。:

错误代码2:

  org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in

read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly'

marker from transaction definition

错误原因:

  OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER

。然后把该sessionFactory绑定到TransactionSynchronizationManager,使request的整个过程都使用同一个

session,在请求过后再接除该sessionFactory的绑定,最后closeSessionIfNecessary根据该session是否已和

transaction绑定来决定是否关闭session。在这个过程中,若HibernateTemplate 发现自当前session有不是

readOnly的transaction,就会获取到FlushMode.AUTO Session,使方法拥有写权限。

也即是,如果有不是readOnly的transaction就可以由Flush.NEVER转为Flush.AUTO,拥有insert,update,delete

操作权限,如果没有transaction,并且没有另外人为地设flush model的话,则doFilter的整个过程都是

Flush.NEVER。所以受transaction保护的方法有写权限,没受保护的则没有。

解决办法:

  采用spring的事务声明,使方法受transaction控制

    <bean id="baseTransaction"
       class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
          abstract="true">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="proxyTargetClass" value="true"/>
        <property name="transactionAttributes">
            <props>
                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="add*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="remove*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>
    <bean id="userService" parent="baseTransaction">
        <property name="target">
            <bean class="com.phopesoft.security.service.impl.UserServiceImpl"/>
        </property> 
      <property name="target">
            <ref bean ="已定义的bean"/>
        </property>
    </bean>
   但是无论我用什么方法,始终出现上面的exception,经过一天的查找,终于发现...
   在spring的aop服务配置中,包名写错了...
   <aop:config >
    <aop:pointcut id="allManagerMethod" expression="execution (* com.feng.manager.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
   </aop:config>
  
   <aop:config >
    <aop:pointcut id="allManagerMethod" expression="execution (* com.feng.Manager.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
   </aop:config>


错误代码3:java.lang.IllegalArgumentException: argument type mismatch
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.apache.commons.beanutils.PropertyUtils.setSimpleProperty(PropertyUtils.java:1789)
 at org.apache.commons.beanutils.PropertyUtils.setNestedProperty(PropertyUtils.java:1684)
 at org.apache.commons.beanutils.PropertyUtils.setProperty(PropertyUtils.java:1713)
 at org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:1019)
 at org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:808)
 at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493)
 at org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:816)
 at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
 at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter

(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter

(ApplicationFilterChain.java:206)
 at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal

(OpenSessionInViewFilter.java:174)
 at org.springframework.web.filter.OncePerRequestFilter.doFilter

(OncePerRequestFilter.java:77)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter

(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter

(ApplicationFilterChain.java:206)
 at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal

(CharacterEncodingFilter.java:78)
 at org.springframework.web.filter.OncePerRequestFilter.doFilter

(OncePerRequestFilter.java:77)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter

(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter

(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process

(Http11Protocol.java:583)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
 at java.lang.Thread.run(Thread.java:619)
错误原因:从struts中form表单中提交的数据是String类型的,而form中的类型为日期类型,因此不匹配,需要

进行类型转换,在struts中类型转换有两种方式,一种是通过servlet进行注册(不推荐),另外一种是通过插

件的方式注册转换器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值