我正在进行Spring Hibernate项目。我主要关心的是如何以及在哪里打开和关闭Hibernate会话。我在谷歌上搜索了一下,发现了一篇和spring交易经理有关的文章。我在代码中使用了这个。但我收到了一些与代理类型转换有关的错误。我有多个服务和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
请给我建议我可以使用的方法或任何更好的方法。
您的设计太糟糕了。服务应该有明确的合同。此合同由服务的接口定义。你所有的服务共享相同的接口,这毫无意义:为什么两个完全不同的服务共享同一个契约,并具有相同的方法?
由于它们显然没有相同的方法,现在您不得不强制转换为一个具体的类,而不是依赖于它们的接口,因此您完全失去了类型安全性(和可测试性)。由于它们都有相同的接口,您还必须使用限定符来区分它们。
以下是您的代码应该是什么样子:
@Controller
public class QuestionController {
@Autowired
QuestionDisplayService questionDisplayService;
@Autowired
QuestionService questionService;
@Autowired
UserService userService;
...
long questionid = questionService.addQuestionService(question, tagsid);