【问题标题】:BeanNotOfRequiredTypeException with PlatformTransactionManager带有 PlatformTransactionManager 的 BeanNotOfRequiredTypeException
【发布时间】: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


    【解决方案1】:

    Spring 正在寻找事务管理器——它需要PlatformTransactionManager 接口的具体实现。它被赋予了您的服务实现,这不是PlatformTransactionManager,也不是它所需要的。如果您使用 JDBC,org.springframework.jdbc.datasource.DataSourceTransactionManager 应该可以工作。

    尝试改变:

    <bean id= "platformTransactionManager" class="com.infotech.service.impl.StudentServiceImpl">
    

    收件人:

    <bean id= "platformTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-23
      • 2015-09-19
      • 2016-06-16
      • 1970-01-01
      • 2018-09-11
      • 1970-01-01
      • 2013-01-08
      • 2016-02-13
      相关资源
      最近更新 更多