2016-06-27 208 views
0

在Spring MVC配置文件中我有這樣幾個部分:春季控制器兩次

<bean id="handler" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" 
      p:alwaysUseFullPath="true" 
      p:contentNegotiationManager-ref="contentNegotiationManager" 
      p:useRegisteredSuffixPatternMatch="true" /> 

<mvc:annotation-driven /> 

<context:annotation-config/> 

<context:component-scan base-package="com.tarhun.geo" use-default-filters="false"> 
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 
</context:component-scan> 

的問題是,控制器映射在日誌中註冊了兩次,也就是我看到每個映射消息重複:

annotation.RequestMappingHandlerMapping:217 - 映射「{[/ rest/company/{companyId}]」,遇見hods = [],params = [],heade ....

我覺得問題在那個自定義RequestMappingHandlerMapping的定義中。因爲我刪除它 - 我的控制器只映射一次。但我仍然需要它,因爲如果我刪除它,我試圖調用API時得到異常:No mapping found...

您能否請建議一些?我也有其他Spring上下文配置文件,但我確定他們沒有加載控制器第二次(我甚至使用context:exclude=Controller來防止這種情況)。

+0

,還有應該是默認的映射處理。 –

+0

@RomanC好的,我會嘗試刪除它。但是,我仍然有點困惑它是如何成爲問題的?據我瞭解所有這些做第一個配置節(我們聲明'handler' bean) - 它只是配置'RequestMappingHandlerMapping'單例。後來這個配置的bean應該在Spring內部使用。 – MyTitle

回答

1

在你的mvc配置中,組件被掃描兩次,你不需要那樣做。

在配置中,您可以設置註釋驅動的配置,並且您的xml配置應該如下所示。

<aop:aspectj-autoproxy /> 

<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/> 
     <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

<context:component-scan base-package="com.tarhun.geo" /> 

<!-- UI resources exclusions from servlet mapping --> 
<mvc:resources location="/ui/" mapping="/ui/**"/> 

添加包含/排除過濾器是可選的,如果你只是想加載你不需要它控制器,服務或信息庫

+0

爲什麼他們被掃描兩次?由於'RequestMappingHandlerMapping'? – MyTitle

+1

是的。 請閱讀[RequestMappingHandlerMapping](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerMapping.html)文檔。它總是掃描Controller和RequestMapping並生成RequestMappingInfo對象。如果您在xml中配置註釋驅動的掃描,則不需要執行此操作。 –