2010-08-22 2 views
4

У меня есть проблема с простой Spring MVC контроллер написанном в Скале:Нет Адаптер для обработчика в Spring MVC

@Controller 
class HelloWorldController { 

implicit def sessionFactory2Session(sf: SessionFactory) = sf.getCurrentSes 
@Autowired 
    var sessionFactory: SessionFactory = null 

@Transactional 
@RequestMapping(value=Array("/hello.html"),method = Array(RequestMethod.GET,RequestMethod.POST)) 
def showHello = { 

    val document = new CustomDocument("name","custom") 
    sessionFactory.save(document) 
    sessionFactory.flush 

    "helloPage" 
    } 
} 

Когда я попытался получить доступ к /hello.html я получил исключение:

javax.servlet.ServletException: No adapter for handler: Does your handler implement a supported interface like Controller? 
at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:951) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:758) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:717) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 

Но когда я удалил аннотацию @Transactional - все работает !!. Spring не может найти сопоставление запросов с двумя аннотациями? Мой фрагмент applicationContext.xml:

<bean id="openSessionInViewInterceptor" 
     class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <list><ref bean="openSessionInViewInterceptor"/></list> 
    </property> 
    <property name="alwaysUseFullPath" value="true" /> 
</bean> 
<context:component-scan base-package="scala.hibernate"/> 

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <property name="viewClass" 
       value="org.springframework.web.servlet.view.JstlView"/> 
    <property name="prefix" value="/WEB-INF/jsp/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 

<!-- for transaction --> 
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManaager"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
     <property name="dataSource" ref="dataSource"/> 
</bean> 
<tx:annotation-driven/> 

EDIT

транзакционный аспект применяется с использованием динамического прокси, и это мешает Spring MVC доступ к @RequestMapping аннотаций на целевом классе Решение:

<tx:annotation-driven proxy-target-class="true"/> 
+1

См http://stackoverflow.com/questions/3111698/spring-controller-and-transactionmanager/3111977#3111977 – axtavt

+0

Thx это помогает !!! – nablik

+0

Кстати: вы, вероятно, не хотите иметь '@ Transactional' в своих методах контроллера. – soulcheck

ответ

0

Просьба добавить <context:annotation-config /> к вашему applicationContext.xml и посмотреть, сможет ли эта проблема устранить проблему.

+0

Он по-прежнему не работает. – nablik

-1

объявить следующие bean. это должно решить проблему

<bean id="simpleHandler" class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 

обновит вы когда-то выяснить причину ..

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