<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>
答案 0 :(得分:3)
这是我的研究猜测。可能是您的Valve
绑定到Host
容器?
您的自定义阀门是否直接继承org.apache.catalina.valves.ValveBase
?如果是这样,它应该有效。
您可以尝试从两个设置中打印出Valve上的getContainer()
,看看它是否正确识别每次设置的Catalina containers (Engine, Host, Context)中的哪一个。
像SingleSignOn这样的某些阀门绑定到像Host
这样的容器,这意味着它不能在其他容器上工作。这也适用于子类化的阀门。
答案 1 :(得分:0)
作为启动的一部分,SetPropertiesRule将尝试为您的自定义属性查找getter。