在应用程序context.xml中定义自定义UserDatabase资源

时间:2017-08-14 11:48:44

标签: java xml tomcat

我想知道是否可以使用基于应用程序context.xml中定义的org.apache.catalina.users.MemoryUserDatabaseFactory的UserDatabase

如果我在tomcat-s server.xml中将此资源定义为全局,它似乎没问题,但如果我在应用程序的context.xml中定义相同的资源,则启动应用程序时似乎存在问题。

原始的UserDatabase资源保持不变,我想阻止更改server.xml或覆盖任何现有的tomcat conf文件,因为最后这是特定于应用程序的资源,因此它应该仅针对应用程序定义,而不是全局定义服务器。这甚至可以吗?

context.xml中的资源定义:

<Resource name="PeUserDatabase" 
  auth="Container" 
  description="Custom In memory user database" 
  factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
  pathname="conf/pe-tomcat-users.xml" 
  type="org.apache.catalina.UserDatabase"/>

在应用程序context.xml中使用资源:

<Realm className="org.apache.catalina.realm.LockOutRealm">
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="PeUserDatabase"/>
</Realm>

异常:

SEVERE: Failed to start "org.apache.catalina.realm.UserDatabaseRealm/1.0" realm
org.apache.catalina.LifecycleException: Failed to start component [Realm[UserDatabaseRealm]]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
        at org.apache.catalina.realm.CombinedRealm.startInternal(CombinedRealm.java:236)
        at org.apache.catalina.realm.LockOutRealm.startInternal(LockOutRealm.java:120)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5517)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
        at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:712)
        at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:2002)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: No UserDatabase component found under key PeUserDatabase
        at org.apache.catalina.realm.UserDatabaseRealm.startInternal(UserDatabaseRealm.java:262)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        ... 15 more

2 个答案:

答案 0 :(得分:0)

你是否将override = true? 。以下是一个例子。

<Context antiJARLocking="true" override="true">

让我知道它是否有效

答案 1 :(得分:0)

好吧,似乎无法使用本地资源配置org.apache.catalina.realm.UserDatabaseRealm。资源需要是全局的,也就是在server.xml中定义

围绕这种方式使用其他类型的领域,org.apache.catalina.realm.MemoryRealm在我的情况下,权衡是这个领域在运行时是不可管理的,每次更改只有在重新启动后才可见。