我正在从事 Spring-Hibernate 项目。我主要关心的是如何以及在哪里打开和关闭 Hibernate session 。我用谷歌搜索,找到了与 spring 事务管理器相关的文章。我在我的代码中使用了这个。但我收到一些与代理类型转换相关的错误。 我有多个服务和 dao 类,并且我正在使用每个服务类都实现的接口(interface)服务。 在 Controller 中我正在编写这样的代码
@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 cannot be cast to com.frodo.questionbank.service.impl.QuestionService
请建议我可以使用的方式或任何更好的方法。
最佳答案
你的设计很糟糕。服务应该有明确的契约(Contract)。该契约由服务的接口(interface)定义。所有服务共享相同的接口(interface),这没有任何意义:为什么两个完全不同的服务共享相同的合约并具有相同的方法?
由于它们显然没有相同的方法,现在您被迫转换为具体的类而不是依赖它们的接口(interface),因此您完全失去了类型安全性(和可测试性)。由于它们都具有相同的界面,因此您还被迫使用限定符来区分它们。
您的代码应如下所示:
@Controller
public class QuestionController {
@Autowired
QuestionDisplayService questionDisplayService;
@Autowired
QuestionService questionService;
@Autowired
UserService userService;
...
long questionid = questionService.addQuestionService(question, tagsid);
关于java.lang.ClassCastException : com. sun.proxy.$Proxy29 无法转换为 com.frodo.questionbank.service.impl.QuestionService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26570891/