У меня есть метод Spring MVC Controller, который помечен как «Транзакционный», который выполняет несколько служебных вызовов, которые также помечены как «Транзакционные», но они рассматриваются как независимые транзакции и выполняются отдельно вместо все по одной транзакции, как я желаю.Сделка не работает правильно - Spring/MyBatis
Основываясь на выходе отладки, появляется, что Spring создает транзакции только при достижении служебных вызовов. Я увижу вывод «Создание новой транзакции с именем ...» только для них, но не для метода контроллера, который их вызывает.
Есть ли что-то очевидное, что мне не хватает?
Пример кода (сокращенно) ниже, контроллер:
@Controller
public class BlahBlah etc...
@Autowired
SomeService someService;
@Transactional
@RequestMapping(value="windows/submit", method=RequestMethod.POST)
@ResponseBody
public String submit (@RequestBody SomeObject blah) throws Exception {
someService.doInsert(blah);
if (true) throw Exception("blah");
... other stuff
}
код услуги:
public interface SomeService {
@Transactional
public void doInsert (SomeObject blah);
}
Я попытался удалить транзакционной тег из вызова службы мышления, может быть, я испортил его и я говорю он должен создать один для каждого вызова, но затем в отладочном выходе не создается транзакция.
Таким образом, в результате я получаю принудительное исключение и проверю таблицу, вставка зафиксировала вместо отката назад, как я хочу.
Так что же я сделал не так?
Почему Spring игнорирует тег Transactional на контроллере?
проводки соответствующую часть моего контекста в соответствии с просьбой комментатора:
web.xml:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring.xml
classpath:spring-security.xml
classpath:spring-datasource.xml
</param-value>
</context-param>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
Sping-mvc.xml:
<context:annotation-config/>
<context:component-scan base-package="com.blah"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver" p:order="1" />
... non-relevent stuff
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
<property name="cacheSeconds" value="0"/>
<property name="useExpiresHeader" value="true"/>
<property name="useCacheControlHeader" value="true"/>
<property name="useCacheControlNoStore" value="true"/>
</bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean id="httpInterceptor" class="com.blah.BlahInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
<mvc:view-controller path="/" view-name="blah"/>
<context:component-scan base-package="com.blah"/>
Хм, вот заинтересованные и непреднамеренные - у меня есть дублирование компонентов. Может ли это быть причиной этого?
Пожалуйста, разместите свой контекст. Вероятно, вы не правильно проверили классы контроллера. –
OK good suugestion, я отредактирую свое сообщение и добавлю его в конец – Trant