2014-10-26 3 views
0

Я работаю над проектом Spring-Hibernate. Моя основная проблема связана с тем, как и где открывать и закрывать сеанс Hibernate. Я искал его, и я нашел статью, связанную с менеджером весенних транзакций. Я использовал это в своем коде. Но я получаю некоторую ошибку, связанную с типизацией прокси. У меня есть несколько классов обслуживания и dao, и я использую Interface Service, который реализует каждый класс сервиса. В контроллере я пишу код, как этот

@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

Horrible кодирования .. !! Измените сервис с соответствующими классами обслуживания –

ответ

2

Ваш дизайн ужасен. Предполагается, что у службы есть четкий контракт. Этот контракт определяется интерфейсом службы. Все ваши сервисы имеют один и тот же интерфейс, что не имеет никакого смысла: почему две совершенно разные службы используют один и тот же контракт и имеют одинаковые методы?

Поскольку они, очевидно, не имеют одинаковых методов, теперь вас вынуждают бросать в конкретный класс вместо того, чтобы полагаться на их интерфейс, и вы полностью теряете безопасность по типу (и проверяемость). И поскольку все они имеют один и тот же интерфейс, вы также вынуждены использовать классификатор, чтобы отличать их.

Вот что ваш код должен выглядеть следующим образом:

@Controller 
public class QuestionController { 

    @Autowired 
    QuestionDisplayService questionDisplayService; 

    @Autowired 
    QuestionService questionService; 

    @Autowired 
    UserService userService; 

    ... 

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

thanks @ Nizet.I обновил код как и предложил. Теперь я получаю новую ошибку: не определен bean с именем 'txMgr'. –

+0

Я нашел статью [link] (http://www.baeldung.com/spring-nosuchbeandefinitionexception) и попробовал это как хорошо. Но это не сработало –

+0

Это совершенно другая проблема, не связанная с проблемой в этом вопросе. Задайте другой вопрос, указав соответствующий код, конфигурационные файлы и трассировку стека исключений. –

Смежные вопросы