【发布时间】:2019-08-19 16:50:47
【问题描述】:
我是 Spring 新手,我按照 youtube 教程进行了登录/注册应用程序,但我想添加一个允许删除学生的新功能。我在我的删除方法上使用了@Transactional 并相应地修改了 xml 文件,但我收到了这个错误:
Message Request processing failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'platformTransactionManager' is expected to be of type 'org.springframework.transaction.PlatformTransactionManager' but was actually of type 'com.infotech.service.impl.StudentServiceImpl'
我的服务类
@Service("studentService")
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDAO studentDAO;
public void setStudentDAO(StudentDAO studentDAO) {
this.studentDAO = studentDAO;
}
public StudentDAO getStudentDAO() {
return studentDAO;
}
//other methods
@Override
public void delete(String email) {
getStudentDAO().delete(email);
}
}
我的 DAO 类
@EnableTransactionManagement
@Repository("studentDAO")
public class StudentDAOImpl implements StudentDAO {
@Autowired
private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
@Autowired
private SessionFactory sessionFactory;
protected Session getSession() {
return (Session) sessionFactory.getCurrentSession();
}
//other methods
@Transactional("platformTransactionManager")
public void delete(String email) {
Student student = (Student) ((HibernateTemplate) getSession()).get(Student.class, email);
((HibernateTemplate) getSession()).delete(student);
}
}
在调度程序 servlet 中,我定义了 InternalResourceViewResolver、dataSource、hibernateTemplate、sessionFactory bean,然后我添加了另一个 bean
<tx:annotation-driven transaction-manager="platformTransactionManager"/>
<bean id= "platformTransactionManager"class="com.infotech.service.impl.StudentServiceImpl">
</bean>
最后,这是控制器
@Controller
public class MyController {
@Autowired
private StudentService studentService;
public void setStudentService(StudentService studentService) {
this.studentService = studentService;
}
public StudentService getStudentService() {
return studentService;
}
//...RequestMappings...
@RequestMapping(value = "/delete/{email}", method = RequestMethod.GET)
public ModelAndView delete(@PathVariable("email") String email) {
studentService.delete(email);
return new ModelAndView("redirect:/view/home");
}
...
}
现在,如何使我的 bean 成为 PlatformTransactionManager 类型? 但最重要的是,我认为有一种更简单的方法可以从我的表中删除一个字段,也许根本不使用 @Transaction 所以任何人都可以帮助我理解为什么我得到错误并解释我什么是@Transactional 以及我是否真的应该使用它在这种情况下? 请记住,我是 Spring 的新手,如果我写了一些完全愚蠢的东西,我仍然没有太多的想法很抱歉:-)
【问题讨论】:
标签: spring spring-mvc exception transactions autowired