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>