我的tomcat(7.0.34)显示错误
命名上下文创建失败:javax.naming.OperationNotSupportedException: Context is read only
当它启动时。但我不知道为什么?如何解决这个问题?
更新日志: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
Java EE规范在第5.3.4节中声明命名上下文必须是只读的,并且必须在更改请求时抛出operationnotsupportedexception。不幸的是,这并不能直接回答你的问题,但可能是一个提示
引用自规范:
容器必须确保应用程序组件实例对其命名上下文只有读访问权限。容器必须从修改环境命名上下文及其子上下文的javax.naming.Context接口的所有方法抛出javax.naming.OperationNotSupportedException。
我们最近将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">
我最近得到了同样的错误。这是由于配置错误,我的JNDI服务器url缺少斜杠。
所以我有
java.naming.provider.url=tcp:/10.211.55.3:7222
不是java.naming.provider.url=tcp://10.211.55.3:7222