我正在开发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
请建议我使用的方式或更好的方法。
答案 0 :(得分:2)
你的设计很糟糕。服务应该有明确的合同。此合同由服务的接口定义。您的所有服务共享相同的界面,这没有任何意义:为什么两个完全不同的服务共享相同的合同并具有相同的方法?
由于他们显然没有相同的方法,现在你被迫强制转换为具体的类而不是依赖于他们的界面,因此你完全失去了类型安全性(和可测试性)。由于它们都具有相同的界面,因此您还必须使用限定符来区分它们。
这是您的代码应该是什么样子:
@Controller
public class QuestionController {
@Autowired
QuestionDisplayService questionDisplayService;
@Autowired
QuestionService questionService;
@Autowired
UserService userService;
...
long questionid = questionService.addQuestionService(question, tagsid);