От выполнения запроса.
Исключение:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause
javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:282)
Вот мой класс конфигурации приложения, а также services class
и DAO
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan("com.ghumapp");
em.setJpaDialect(jpaDialect());
em.setJpaVendorAdapter( jpaVendorAdapter());
em.setJpaProperties(additionalProperties());
return em;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl("Jdbc:mysql://localhost:3306/ghumapp?useSSL=false&serverTimezone=UTC");
dataSource.setUsername("password");
dataSource.setPassword("password");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
return dataSource;
}
private JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabasePlatform(env.getProperty("jdbc.dialect"));
return vendorAdapter;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
private JpaDialect jpaDialect() {
return new HibernateJpaDialect();
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
public Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.show_sql", "true");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
return properties;
}
Вот мой Класс обслуживания:
@PostMapping("/persist")
public String persistuser(@RequestParam("password") String password,
@RequestParam("userName") String userName, @RequestParam("firstName") String firstName,
@RequestParam("lastName") String lastName, @RequestParam("email") String Email) {
AppUser appUser = appUserDAO.geAppUserPersist(password, userName, firstName, lastName, Email );
PersistenceService.persist(em, appUser);
return "";
}
Вот мой DAO
класс, который имеет @trasactional
аннотацию, и я пробовал также с пружинной аннотацией trasactional
@Transactional
public AppUser geAppUserPersist(String password, String userName, String firstName, String lastName, String email ) {
AppUser appUser = new AppUser();
if(password != null)
password = password.trim();
appUser.setPassword(password);
appUser.setUserName(userName);
appUser.setFirstName(firstName);
appUser.setLastName(lastName);
appUser.setEmail(email);
return appUser;
}