当tomcat启动时,什么可能导致“javax.naming.OperationNotSupportedException”

时间:2013-03-11 13:46:37

标签: java-ee tomcat jndi

我的tomcat(7.0.34)显示错误为

  

创建命名上下文失败:   javax.naming.OperationNotSupportedException:上下文是只读的

启动时。但我不知道为什么?以及如何解决它?

更新

日志:

Info: Starting Servlet Engine: Apache Tomcat/7.0.34
Mar 11, 2013 9:43:18 PM org.apache.catalina.core.NamingContextListener lifecycleEvent
Critical: Creation of the naming context failed: javax.naming.OperationNotSupportedException: Context is read only
Mar 11, 2013 9:43:18 PM org.apache.coyote.AbstractProtocol start
Info: Starting ProtocolHandler ["ajp-bio-8081"]
Mar 11, 2013 9:43:18 PM org.apache.catalina.core.StandardService startInternal
Info: Starting service ChongWuXingQiu
Mar 11, 2013 9:43:18 PM org.apache.catalina.core.StandardEngine startInternal
Info: Starting Servlet Engine: Apache Tomcat/7.0.34
Mar 11, 2013 9:43:18 PM org.apache.catalina.core.NamingContextListener lifecycleEvent
Critical: Creation of the naming context failed: javax.naming.OperationNotSupportedException: Context is read only
Mar 11, 2013 9:43:18 PM org.apache.coyote.AbstractProtocol start
Info: Starting ProtocolHandler ["ajp-bio-8082"]
Mar 11, 2013 9:43:18 PM org.apache.catalina.startup.Catalina start
Info: Server startup in 1753 ms

3 个答案:

答案 0 :(得分:3)

Java EE规范在第5.3.4节中指出,命名上下文必须是只读的,并且必须在更改请求上抛出OperationNotSupportedExceptions。不幸的是,这并没有直接回答你的问题,但可能是一个暗示

来自spec

的引用
  

容器必须确保应用程序组件实例仅具有对其命名上下文的读访问权。容器必须从javax.naming.Context接口的所有方法抛出javax.naming.OperationNotSupportedException,它修改环境命名上下文及其子上下文。

答案 1 :(得分:1)

我们最近将tomcat实例从Tomcat 5升级到Tomcat 7.现有代码如下所示:

Context initCtx;
initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
strSMTPFrom = (String) envCtx.lookup("env/SMTP_From");
envCtx.close();
envCtx = null;

最后两行显然是为了释放资源,但Tomcat不接受这一点(参见https://bz.apache.org/bugzilla/show_bug.cgi?id=51744)。如果您无法更改代码,那么解决方法是将jndiExceptionOnFailedWrite应用于上下文(https://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Standard_Implementation),例如

<Context jndiExceptionOnFailedWrite="false">

答案 2 :(得分:-1)

我最近得到了同样的错误。这是由于配置错误导致我的JNDI服务器URL缺少斜杠。

所以我有

java.naming.provider.url=tcp:/10.211.55.3:7222

而不是

java.naming.provider.url=tcp://10.211.55.3:7222