java.lang.ClassCastException:com.sun.proxy。$ Proxy29无法强制转换为com.frodo.questionbank.service.impl.QuestionService

时间:2014-10-26 07:44:02

标签: java spring hibernate spring-mvc

我正在开发Spring-Hibernate项目。我主要关注的是如何以及在何处打开和关闭Hibernate会话。我用谷歌搜索了一下,我找到了与春季交易经理相关的文章。我在我的代码中使用了这个。但我得到一些与代理的类型转换相关的错误。 我有多个服务和dao类,我正在使用每个服务类实现的接口服务。 在控制器中,我正在编写像这样的代码

@Controller
public class QuestionController {

    @Autowired
    @Qualifier(value="questionDisplayService")
    Service questionService;

    @Autowired
    @Qualifier(value="questionService")
    Service qService;

    @Autowired
    @Qualifier(value="userServiceImpl")
    Service uService;

我稍后就像这样输入

 long questionid = ((QuestionService) qService).addQuestionService(question, tagsid);

现在我收到了以下错误

  

java.lang.ClassCastException:com.sun.proxy。$ Proxy29无法强制转换为com.frodo.questionbank.service.impl.QuestionService

请建议我使用的方式或更好的方法。

1 个答案:

答案 0 :(得分:2)

你的设计很糟糕。服务应该有明确的合同。此合同由服务的接口定义。您的所有服务共享相同的界面,这没有任何意义:为什么两个完全不同的服务共享相同的合同并具有相同的方法?

由于他们显然没有相同的方法,现在你被迫强制转换为具体的类而不是依赖于他们的界面,因此你完全失去了类型安全性(和可测试性)。由于它们都具有相同的界面,因此您还必须使用限定符来区分它们。

这是您的代码应该是什么样子:

@Controller
public class QuestionController {

    @Autowired
    QuestionDisplayService questionDisplayService;

    @Autowired
    QuestionService questionService;

    @Autowired
    UserService userService;

    ...

    long questionid = questionService.addQuestionService(question, tagsid);