Spring 组件扫描问题@Transactional donds';不能与@Controller一起工作
我认为Spring 组件扫描问题@Transactional donds';不能与@Controller一起工作,spring,hibernate,spring-mvc,Spring,Hibernate,Spring Mvc,我认为@Transactional不适用于其他注释,例如@Controller,或者我在组件扫描方面遇到问题和困惑,因为我遇到以下错误: org.hibernate.HibernateException: No Session found for current thread 以下是我的配置文件: mvc-dispatcher-servlet.xml <context:component-scan base-package="controller"/> <mvc:annota
@Transactional
不适用于其他注释,例如@Controller
,或者我在组件扫描方面遇到问题和困惑,因为我遇到以下错误:
org.hibernate.HibernateException: No Session found for current thread
以下是我的配置文件:
mvc-dispatcher-servlet.xml
<context:component-scan base-package="controller"/>
<mvc:annotation-driven />
My web.xml
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>hibernate.xml</param-value>
</context-param>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
org.springframework.web.context.ContextLoaderListener
上下文配置位置
hibernate.xml
mvc调度器
org.springframework.web.servlet.DispatcherServlet
上下文配置位置
mvc-dispatcher-servlet.xml
1.
mvc调度器
/
您的事务性配置应用于根上下文,该根上下文也会扫描您的控制器
包
基本上,你最终会
- 根上下文:
@Controller
具有事务行为的bean
- Servlet上下文:
@Controller
没有事务行为的bean
你有重复的豆子。但是,DispatcherServlet
从Servlet上下文中的@Controller
bean构建其MVC堆栈,而这些bean不是事务拦截器建议的
您可以将事务性配置移动到servlet上下文,也可以将事务性行为移动到根上下文中声明的@Service
bean
相关的:
您的事务性配置应用于根上下文,该根上下文也会扫描您的控制器
包
基本上,你最终会
- 根上下文:
@Controller
具有事务行为的bean
- Servlet上下文:
@Controller
没有事务行为的bean
你有重复的豆子。但是,DispatcherServlet
从Servlet上下文中的@Controller
bean构建其MVC堆栈,而这些bean不是事务拦截器建议的
您可以将事务性配置移动到servlet上下文,也可以将事务性行为移动到根上下文中声明的@Service
bean
相关的:
显示堆栈跟踪。我怀疑它是从视图而不是控制器中抛出的。显示堆栈跟踪。我怀疑它是从视图中抛出的,而不是从控制器中抛出的。可能值得在不同的环境中使用一个规范的bean Spring Q&a。@chrylis我同意你的看法。在链接的q/a中链接的应用程序上下文与servlet上下文
问题可能是一个很好的起点。你做了另一个很好的问题,关于<代码> NUL/<代码> @ AutoWord,你不妨这样做。我当然也不理解它(为什么我更喜欢春靴的一部分),但是如果你不想做它,我可以尝试一下。@ CuryIIS,如果你把它做成社区帖子,我会考虑添加它。我现在非常严格:| 1-我将事务配置移动到servlet上下文中,非常感谢。2-但是我不理解第二个选项,你能解释一下吗,因为我没有@Service
bean 3-我怎么能看到spring生成的bean?4-如何避免重复的bean?恐怕这会引起我的问题。如果你能编辑答案,那将是非常好的:)在不同的背景下,可能值得拥有一个规范的bean春季问答。@chrylis我同意你的看法。在链接的q/a中链接的应用程序上下文与servlet上下文
问题可能是一个很好的起点。你做了另一个很好的问题,关于<代码> NUL/<代码> @ AutoWord,你不妨这样做。我当然也不理解它(为什么我更喜欢春靴的一部分),但是如果你不想做它,我可以尝试一下。@ CuryIIS,如果你把它做成社区帖子,我会考虑添加它。我现在非常严格:| 1-我将事务配置移动到servlet上下文中,非常感谢。2-但是我不理解第二个选项,你能解释一下吗,因为我没有@Service
bean 3-我怎么能看到spring生成的bean?4-如何避免重复的bean?恐怕这会引起我的问题。如果你能编辑答案,那就太好了:)
@Transactional
@Controller
public class Test {
@Autowired
private SessionFactory sessionFactory;
@RequestMapping(value="/")
public String test() {
...
sessionFactory.getCurrentSession().get(Region.class,1);
...
}
...
}
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>hibernate.xml</param-value>
</context-param>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>