Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring@Transactional&x27;不能使用其他注释吗?_Spring_Spring Mvc_Spring Annotations - Fatal编程技术网

Spring@Transactional&x27;不能使用其他注释吗?

Spring@Transactional&x27;不能使用其他注释吗?,spring,spring-mvc,spring-annotations,Spring,Spring Mvc,Spring Annotations,所以我的春季教育还在继续。目前我正在尝试学习一些注释以及它们给Spring3带来的东西。所以我有一个迷你网络应用程序,可以连接到数据库,通过表单输入内容,显示记录等等。一切正常。我决定尝试让Spring自动检测我标记为@Transactional的服务bean,但这样做会阻止应用程序保存到DB。因此: @Transactional public class ReservationServiceImpl implements ReservationService { 这很有效。我在springc

所以我的春季教育还在继续。目前我正在尝试学习一些注释以及它们给Spring3带来的东西。所以我有一个迷你网络应用程序,可以连接到数据库,通过表单输入内容,显示记录等等。一切正常。我决定尝试让Spring自动检测我标记为@Transactional的服务bean,但这样做会阻止应用程序保存到DB。因此:

@Transactional
public class ReservationServiceImpl implements ReservationService {
这很有效。我在springcourt-data.xml文件中有一个此类的bean声明。没问题。但当我这样做时:

@Transacational
@Service("reservationService")
public class ReservationServiceImpl implements ReservationService {
它不再起作用了。我确实有

<context:component-scan base-package="com.springcourt" />

在springcourt-servlet.xml文件中。有人能告诉我我搞砸了什么吗?我所做的就是向这个类添加另一个注释,并从xml文件中删除bean定义,这样它就不再将数据保存到DB中。我仍然可以从数据库中查询记录和内容,尽管很明显它使用的是自动检测服务bean

以下是配置文件:

springcourt-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<context:component-scan base-package="com.springcourt" />

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="com.springcourt.web.ReservationBindingInitializer" />
    </property>
</bean>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>
</beans>
springcourt-servlet.xml
以及:

springcourt-data.xml

因为您可以通过同一个bean查询DB,所以您的
@Transactional
可以正常工作,或者您经常会遇到异常(至少在Hibernate中是这样)。在保存操作中,很可能会出现导致事务回滚的运行时异常。试着找出什么是异常并从那里开始


更新

要查看是否应用了
@Transactional
,请从方法内部打印堆栈跟踪。如果您看到带有大量事务拦截器的长堆栈跟踪,则意味着事务方面可以工作

试试这个

  • 将上下文组件扫描添加到spring-court-data.xml

      <context:component-scan base-package="com.springcourt" />
    
    <aop:aspectj-autoproxy/>
    

当您使用@Service和组件扫描时,bean是由DispatcherServlet(mvc)创建的上下文创建的。由于transaction:annotation-driven是在根应用程序上下文中定义的,因此它不适用于servlet上下文中的bean。您可以通过删除@Service并将bean定义移动到servlet上下文文件来验证这一点——您应该会看到相同的结果

当您不使用组件扫描时,bean是在根应用程序上下文的XML中定义的

修复方法是将web层中的组件扫描标记更改为仅包含web层类—可以使用不同的基本包,也可以使用包含/排除过滤器。在根应用程序上下文中为其他bean添加另一个组件扫描


查询可能正在工作,因为您可能配置了OpenEntityManagerInViewInterceptor/筛选器。

我也遇到了同样的问题并解决了它

首先,您必须将上下文:组件扫描与web和数据级别分开,如下所示:

<!--in springcourt-servlet.xml -->
<context:component-scan base-package="com.springcourt.web" />

<!--in springcourt-data.xml -->
<context:component-scan base-package="com.springcourt.dao" />

第二个添加到springcourt-data.xml

  <context:component-scan base-package="com.springcourt" />
<aop:aspectj-autoproxy/>


我希望这会有所帮助

除了您所拥有的功能外,您还可以使用以下功能:`

 @Configuration
 @EnableAspectJAutoProxy(proxyTargetClass=true)
 public class AppConfig {
     (...)
 }
您需要做的是在同一范围内注入所有内容。一种方法是更改ApplicationContext xml,如前所述,另一种方法是使用类似于CGLIB的Spring代理,以便获得基于子类的代理,并在其中编写bean实现和定义

进一步阅读:


当然我可能错了,但我认为这根本不准确。我可以完全删除事务标记,仍然可以从数据库中查询和检索数据。我的理解是@Transactional只会影响将数据持久化到数据库。而且,没有错误。我可以一步一步地完成代码,并将内容放入Try/Catch块中,我看不到会抛出任何异常。您没有提到您使用的持久化技术。它是普通的JDBC吗?在这种情况下,您可能不需要
@Transactional
,因为每个语句都可以在自己的事务中运行(取决于配置)。这同样适用于读和写。查看
@Transactional
是否从方法内部应用了打印堆栈跟踪。如果您看到带有大量事务拦截器的长堆栈跟踪,则意味着事务方面可以工作。我很难想象数据没有被保存而没有任何错误。对不起,我并不奇怪我忘记了什么。我通过Hibernate连接到MySQL数据库使用JPA。我在上面添加了配置文件。另外,如果没有抛出任何内容,如何从stacktrace打印任何内容?我将仔细研究一下,看看我的猜测。要打印堆栈跟踪,只需将Thread.dumpStack()放在方法中。感谢提供的信息,我没有意识到这一点。也许我用错了地方,但我看不出这有什么价值。它只显示当前线程正在执行的方法,其中之一是将对象持久化到DB的方法。不过没有其他信息,只有方法调用。有几件事你为什么要在上下文中声明reservationService并在@Service中注释它,还要将上下文组件扫描添加到第二个上下文文件中,该文件在你的帖子中的“和”后面列出。你在“@Transactional”中有一个拼写错误。将其更正为“@Transactional”不,没有OpenEntityManagerViewInterceptor。至少我没有明确声明。然而,我尝试了你所说的,并且似乎奏效了。我在spring-court-data.xml文件中声明了服务包的组件扫描标记,并将另一个标记保留在spring-court-servlet.xml文件中。我猜这有点像普拉桑娜·塔拉坎蒂在上面说的。很明显,我不完全理解这些文件的分离对不同标签的影响。再多说一句。我从SpringCourt-*.xml文件中删除了所有配置,并将其放在applicationContext.xml中,重新使用,一切正常。因此,问题肯定与如何在两个文件之间划分有关。如果有人能给我一个清楚的解释