解决方案 »
- el : ${} 和 #{} 区别 ?
- 无法将 javax.servlet.http.HttpSession 中的 setAttribute
- [急]转移程序到一个租用的空间上,程序new MultipartFormDataRequest出错.
- 急求servlet数据分页显示代码!!
- 奇怪的问题???
- jdbc for sql server 2000的驱动程序在哪儿可以找到?
- tomcat 7中配置数据源的问题
- 根据经纬度,由近到远查出最近的的5条数据,应该怎么做啊
- spring 事务的问题
- Java web tomcat启动后500错误
- tomcat如何在http请求结束前执行一段代码
- ssh整合问题
<!-- enable autowire -->
<context:annotation-config />
我有以上配置,但是没有annotation-driven。我是先按照aop配置的,发现没有作用;
又改成全注解方式,也是参考了@baohuan_love说的地址,还是没有作用,所以现在发出来的内容是基于aop的,我在网上看了一下说是aop也需要增加@Transactional,还是无法解决。
我估计是和我使用spring+hibernate集成的使用有关,可能没有配置好,什么地方不合适导致,我只配置了一个数据源(proxool),使用getHibernateTemplate获取的可能不是同一个连接。
@Service
public class TopicServiceImpl implements TopicService {
@Autowired
private TopicDao topicDao; public Long save(Topic topic) {
Long id = (Long) topicDao.save(topic);
topic.setName("这是测试");
if ("abc".equalsIgnoreCase(topic.getContent())) {
throw new RuntimeException("测试");
}
topicDao.update(topic);
return id;
}
private HibernateTemplate hibernateTemplate;
public Serializable save(Object entity) {
return getHibernateTemplate().save(entity);
}
@Resource(name = "hibernateTemplate")
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}调试发现,设置的hibernateTemplate是xml中配置的,但是这个模块是org.hibernate.impl.SessionFactoryImpl,而不是配置的org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean,估计和这个有关吧。
调试的过程中,没有发现使用事务的类。
java.lang.RuntimeException: 测试
at com.abc.forum.service.impl.TopicServiceImpl.save(TopicServiceImpl.java:25)
at com.abc.forum.controller.TopicsController.addTopic(TopicsController.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)我觉得是事务都没有使用,错误栈中都没有事务相关的类。
你可以断点到TransactionInterceptor的invoke方法里面,验证你的方法是否被aop切入事务。
还有如果被aop Interceptor拦截到的话, eclipse(我不确定你的有没有,我用的sts有)是可以在方法的行号旁边看aop拦截标识的。 一个类似于"("的符号。Multiple ers at this line
- implements com.xxxx.xxx.xxxService.xxxx
- advised by
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)鼠标放到符号上还有上面的提示
<context:component-scan base-package="com.abc" use-default-filters="false" >
<context:include-filter expression=".*Controller$" type="regex"/>
</context:component-scan> 服务的扫描除controller外的所有组件
<context:component-scan base-package="com.abc" >
<context:exclude-filter expression=".*Controller$" type="regex"/>
</context:component-scan>