在 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>
问题是 Controller 映射注册了两次,即在日志中我看到每个映射消息都是重复的:
annotation.RequestMappingHandlerMapping:217 - Mapped "{[/rest/company/{companyId}],methods=[],params=[],heade....
我认为自定义 RequestMappingHandlerMapping
定义存在问题。因为当我删除它时 - 我的 Controller 仅映射一次。但我仍然需要它,因为如果我删除它,我在尝试调用 API 时会遇到异常:未找到映射...
你能建议一下吗?
仅供引用,我还有其他 Spring 上下文配置文件,但我确信它们不会第二次加载 Controller (我什至使用 context:exclude=Controller
来防止这种情况)。
最佳答案
在您的 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/**"/>
如果您只想加载 Controller 、服务或存储库,则可以选择添加包含/排除过滤器
关于java - Spring Controller 注册了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38056427/