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

今日、これとまったく同じ問題が発生しました(ただし、コンテキストnamespaceHandlerの場合)。私はハッキーな方法でそれをやった.

という名前のファイルspring.handlersMETA-INFフォルダーに作成し、デフォルトのスキーマをオーバーライドする宣言を配置します。あなたの場合、次のようなものです:

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

為に

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

spring.handlersおそらく、's' より大きい文字 (私の場合は 't') で始まる名前の jar 内でファイルを宣言する必要があります。これは、 spring.handlersSpring が検出された順序で定義をマージするためです。

デバッグ情報については、 を参照してくださいDefaultNamespaceHandlerResolver#getHandlerMappings

于 2012-08-17T21:18:19.633 に答える