Как сделать RestController транзакционным? - PullRequest
1 голос
/ 27 октября 2019

Я знаю, что не рекомендуется делать транзакционный контроллер, но хочу попробовать решение, обсуждаемое здесь

Согласно документации Spring MVC 17.3.2 :

Обычная ошибка при работе с аннотированными классами контроллеров возникает при применении функциональности, которая требует создания прокси для объекта контроллера (например, методы @Transactional). Обычно вы вводите интерфейс для контроллера, чтобы использовать динамические прокси JDK. Чтобы сделать это, вы должны переместить аннотации @RequestMapping, а также любые другие аннотации на уровне типа и метода (например, @ModelAttribute, @InitBinder) в интерфейс, так как механизм отображения может только «видеть» интерфейс, предоставляемыйproxy.

Я должен иметь возможность сделать метод RestController транзакционным, если я "переместлю все аннотации методов на его интерфейс"?

В этом предположении я написал следующие коды, которые до сих порне дал мне транзакционный метод doSth ():

public interface SomeController{
   @Transactional
   @RequestMapping(...)
   void doSth()
}

@RestController
public class SomeControllerImpl implements SomeController{
   @Override
   public void doSth(){...}
}

web.xml
    <servlet>
        <servlet-name>someServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>...</init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>someServlet</servlet-name>
        <url-pattern>...</url-pattern>
    </servlet-mapping>

context.spring.xml
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/project" resource-ref="true" />
    <tx:annotation-driven />
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />

Может кто-нибудь помочь объяснить, почему это не работает и есть ли способ сделать метод в RestController транзакционным?

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Попробуйте добавить @Transactional аннотацию к классу SomeControllerImpl, а не к интерфейсу.

@Transactional аннотация будет работать правильно на интерфейсе, если вы используете прокси на основе интерфейса. Тот факт, что аннотации не наследуются, означает, что если вы используете прокси на основе классов, то настройки транзакций не будут распознаваться прокси на основе классов.

Также рекомендация команды Spring:что вы аннотируете только конкретные классы с помощью аннотации @Transactional, в отличие от аннотирования интерфейсов.
Spring Docummentation

0 голосов
/ 27 октября 2019

Чтобы включить аннотационное поведение на основе транзакций, вам нужно упомянуть транзакционный менеджер в tx: annotation-driven.

Пример: <tx:annotation-driven transaction-manager="transactionManager"/>

Это должно решить вашу проблему. пожалуйста, дайте мне знать, если вы нашли это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...