Я использую 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());
}
Как это вообще можно скомпилировать? Класс userServiceImpl выглядит так, как будто он должен расширять что-либо для существующего метода add (user) или, по крайней мере, методы add() должны существовать в классе тогда. – david99world
Что именно происходит? А в какой строке кода? – Avi
Позвольте мне угадать, у вас также есть 'DispatcherServlet', который (также) загружает класс' AppConfig'. Который приводит к дублированию боба, когда у одного есть транзакции, а у другого нет, а как без транзакций ближе к «Контроллеру», он будет использоваться. –