4

我写了一个自定义的 Tomcat 阀门。(我使用的是 Tomcat 6.0.24 和 Java 1.6)这是我声明阀门的 XML 元素:

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

当我将此声明放入 server.xml 的 Host 元素中时。Tomcat 使用值“bar”调用我的阀门上的 setFoo() 方法。这就是我想要发生的事情。

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

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

有谁知道当我的 webapp 的 META-INF/context.xml 中声明 Tomcat 时如何让它正确配置我的阀门?

谢谢,丹

这会导致我的阀门加载并由 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>
4

2 回答 2

3

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

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

您可以尝试从您的两个设置中打印出getContainer()Valve 上的 ,以查看它是否正确识别每次设置的Catalina 容器(引擎、主机、上下文) 。

像SingleSignOn这样的某些Valve被绑定到一个容器Host,这意味着它不会在其他人身上工作。这也适用于子类阀门。

于 2010-09-16T06:50:35.333 回答
0

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

于 2014-11-21T11:47:38.890 回答