0

コンテキスト configLocation をオーバーライドしたい

次のようなweb.xml

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>com.mypackage.MyDispacherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:default-ctx.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

次に MyDispacherServlet があります

public class MyDispacherServlet extends org.springframework.web.servlet.DispatcherServlet {


@Override
public void init(ServletConfig config) throws ServletException {
    // here will be code to find dynamically other-ctx.xml
    String correctSpringXml = "classpath*:other-ctx.xml";
    setContextConfigLocation(correctSpringXml) ;
    super.init(config);
}

@Override
protected WebApplicationContext initWebApplicationContext() throws BeansException {
    WebApplicationContext wac = super.initWebApplicationContext();

    return wac;
}

}

しかし、このコードは機能しません。contextConfigLocation を正しくオーバーライドするにはどうすればよいですか?

4

1 に答える 1

1

initオーバーライドしようとしているメソッド (で定義) を詳しく調べる必要があるようですHttpServletBean

//unimportent parts removed
    @Override
    public final void init() throws ServletException {
            ...
        try {
            PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
            BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
            ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
            bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.environment));
            initBeanWrapper(bw);
            bw.setPropertyValues(pvs, true);
        }
        catch (BeansException ex) {...}
            ...
        // Let subclasses do whatever initialization they like.
        initServletBean();
            ...
    }

パラメータcontextConfigLocationが設定されているようですbw.setPropertyValues(pvs, true);

ソリューションのさまざまなアイデア:

  • init メソッドを完全にオーバーライドする必要があります (を呼び出さずにsuper.init())。そして、呼び出されるpvs前に(これを行う方法で)変更します。bw.setPropertyValues(pvs, true);

  • initServletBean() または、 を呼び出す前に、そこでプロパティをオーバーライドして変更しますsuper.initServletBean()

  • それが私が最初に試みることです:getServletConfig()または、変更された構成を返すよう にオーバーライドしようとします。

于 2013-08-07T10:40:03.453 に答える