2013-10-07 2 views
2

Я использую java-конфигурацию, все работает нормально, кроме @transactional, мне потребовались сервисные дни, но я понятия не имею, почему это не работает, любая помощь будет очень ценим.Spring @transactional не работает

В UserController.java, я пытаюсь позвонить userService.testTransactional (пользователь, запрос);

testTransaction() является метод испытания в UserServiceImpl, "Long.valueOf (" Бросок RuntimeException ");" это линия, которая собирается бросить исключение в этом методе, но пользователь добавляются в любом случае, он должен выполнить откат, но запись пользователя сохраняется

UserController.java

@Controller 
public class UserController { 

    @Resource(name="userService") 
    protected UserService userService; 

    @RequestMapping(value = "/register", method = RequestMethod.POST) 
    public String processRegister(Model model, @ModelAttribute RegisterForm registerForm, HttpServletRequest request) throws Exception { 

     userService.testTransactional(user, request); 

     return "account/register_success"; 
    } 
} 

UserServiceImpl.java

@Service("userService") 
public class UserServiceImpl implements UserService { 

    @Resource 
    private UserDao userDao; 

    @Transactional 
    public void testTransaction(User user, HttpServletRequest request) throws Exception { 
     long userId = userDao.add(user); 
     Long.valueOf("Throw RuntimeException"); 
    } 
} 

Ниже приведены мои конфигурации

web.xml

<!-- Java-based annotation-driven Spring container definition --> 
<context-param> 
    <param-name>contextClass</param-name> 
    <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
</context-param> 

<!-- Location of Java @Configuration classes that configure the components that makeup this application --> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>com.myapp.config</param-value> 
</context-param> 


<!-- Secures the application --> 
<filter> 
    <filter-name>shiroFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>shiroFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
</filter-mapping> 

<!-- Handles requests into the application --> 
<servlet> 
    <servlet-name>appServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <!-- No explicit configuration file reference here: everything is configured in the root container for simplicity -->  
     <param-name>contextConfigLocation</param-name> 
     <param-value></param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<!-- Creates the Spring Container shared by all Servlets and Filters --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

AppConfig.java

@Configuration // Specifies the class as configuration 
@EnableWebMvc //Enables to use Spring's annotations in the code 
@ComponentScan(basePackages = {"com.myapp.account"}) // Specifies which package to scan 
public class AppConfig { 
    ... 

DataConfig.java

@Configuration 
@EnableTransactionManagement 
public class DataConfig { 

    @Bean(destroyMethod="close") 
    public ComboPooledDataSource dataSource() throws PropertyVetoException { 
     ... 
     return cpds; 
    } 

    @Bean 
    public NamedParameterJdbcTemplate jdbcTemplate() throws PropertyVetoException { 
     return new NamedParameterJdbcTemplate(dataSource()); 
    } 

    @Bean 
    public DataSourceTransactionManager transactionManager() throws PropertyVetoException { 
     DataSourceTransactionManager dstm = new DataSourceTransactionManager(dataSource()); 
     return dstm; 
    } 


    @Bean 
    public UserDao userDao() throws PropertyVetoException { 
     return new UserDao(jdbcTemplate()); 
    } 
+1

Как это вообще можно скомпилировать? Класс userServiceImpl выглядит так, как будто он должен расширять что-либо для существующего метода add (user) или, по крайней мере, методы add() должны существовать в классе тогда. – david99world

+1

Что именно происходит? А в какой строке кода? – Avi

+0

Позвольте мне угадать, у вас также есть 'DispatcherServlet', который (также) загружает класс' AppConfig'. Который приводит к дублированию боба, когда у одного есть транзакции, а у другого нет, а как без транзакций ближе к «Контроллеру», он будет использоваться. –

ответ

1

Проблема заключается в том, что вы не указали @EnableTransactionManagement на @Configuration класса, который является компонентом сканирования и создания UserServiceImpl боб. Предполагая, что класс находится в com.myapp.account, тогда класс конфигурации, который компонент сканирует, должен иметь @EnableTransactionManagement. Измените свой DataConfig или ваш AppConfig соответственно.

+0

Я указал @EnableTransactionManagement на DataConfig.java. – gozizibj

+0

@zizibj Да, но 'DataConfig' не создал ваш' UserServiceImpl', поэтому он не может добавить это поведение. –

+0

Добавьте еще несколько кодов в мой вопрос, извините за мой плохой английский, я создаю компонент userDao в DataConfig.java, @Resource userService в моем UserContrller. – gozizibj

Смежные вопросы