2010-09-16 53 views
4

我写了一个定制的Tomcat阀门。 (我使用Tomcat 6.0.24和Java 1.6)这里就是我宣布我的阀的XML元素:定制Tomcat阀门配置

<Valve className="mypkg.MyValve" foo="bar"/> 

当我把server.xml中的Host元素里面这个声明。 Tomcat使用值“bar”在我的阀上调用setFoo()方法。这就是我想要发生的事情。

但是,当我在web应用程序的META-INF/context.xml中放置相同的声明时,在Context元素中,Tomcat加载阀门,阀门运行良好。但Tomcat从未调用setFoo()方法来提供阀所需的“bar”值。

我不明白为什么Tomcat正确地配置了server.xml中声明的阀,但没有在context.xml中声明。

是否有人知道我的Tomcat在我的webapp的META-INF/context.xml中声明时如何正确配置阀门?

感谢, 丹

这导致我的阀来加载和正确的Tomcat的配置:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" 
    xmlValidation="false" xmlNamespaceAware="false"> 

    <Valve className="mypkg.MyValve" foo="bar"/> 
</Host> 

这导致我的阀加载,但Tomcat将不给它的配置参数“ bar“:

<Context privileged="true" > 
    <Valve className="mypkg.MyValve" foo="bar"/> 
</Context> 

回答

3

这是我研究的猜测。这可能是您的Valve绑定到Host容器?

是您的自定义阀门直接子类org.apache.catalina.valves.ValveBase ?如果是这样,它应该工作。

您可以尝试打印出阀门上的getContainer()这两个设置,以查看它是否能正确识别它在每次设置的哪一个Catalina containers (Engine, Host, Context)

某些阀门如SingleSignOn被绑定到像Host这样的容器,这意味着它不会在其他人上工作。这也适用于小型阀门。

0

SetPropertiesRule作为启动的一部分,将尝试为您的自定义属性查找getter。