2

SpringMVC 带有一个由(不出所料)“MvcNamespaceHandler”处理的“mvc”命名空间,定义如下:

public class MvcNamespaceHandler extends NamespaceHandlerSupport {

public void init() {
    registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
    registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser());
    registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());       
    registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser());
    registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser());
}

}

我想修改命名空间的行为,以便 mvc:resources 元素由自定义 ResourcesBeanDefinitionParser 处理(在我的情况下,替换 ResourcesHttpRequestHandler,由 bean 定义解析器创建,具有自定义实现)。

我想知道是否有可能在不经历创建全新命名空间的麻烦的情况下做到这一点(如此处所述http://static.springsource.org/spring/docs/2.0.x/reference/extensible-xml .html)。

谢谢 !

4

2 回答 2

1

您可以创建一个自定义命名空间来注册不同的 ResourceHttpRequestHandler,但正如您所说,这绝对是一项很好的工作。

更好的方法可能是简单地在配置中显式定义 bean,ResourcesBeanDefinition 本质上是这样做的:

<bean name="resourceHandler" class="org.springframework.web.servlet.resource.ResourceHttpRequestHandler">
    <property name="locations">
        <list>
            <value>/resources/</value>
    </property>
</bean>

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="urlMap">
        <map>
            <entry key="/resources/**" value-ref="resourceHandler"/>
        </map>
    </property>
</bean>

您可以在此处简单地将 resourceHandler 替换为您的实现。

于 2012-08-17T10:54:53.357 回答
0

我今天遇到了同样的问题(但对于上下文命名空间处理程序)。我以一种骇人听闻的方式完成了它。

spring.handlers在您的文件夹中创建一个名为的META-INF文件并放置一个覆盖默认模式的声明。在你的情况下,是这样的:

http\://www.springframework.org/schema/mvc=org.springframework.web.servlet.config.MvcNamespaceHandler

为了

http\://www.springframework.org/schema/mvc=YOURBEANPATH.

也许您需要spring.handlers在 jar 中声明文件,其名称以大于“s”的字母开头(在我的情况下是“t”),因为 spring 将按spring.handlers找到的顺序合并定义。

有关调试信息,请查看DefaultNamespaceHandlerResolver#getHandlerMappings.

于 2012-08-17T21:18:19.633 回答