org.apache.catalina.core.DefaultInstanceManager无法强制转换为java.lang.String

时间:2013-12-30 01:49:01

标签: java apache java-ee servlets tomcat7

我的servlet中有以下代码

PrintWriter out = response.getWriter();
out.println("Getting Context scoped attributes<br>");
ServletContext sc = getServletConfig().getServletContext();
Enumeration contextAttribNames = sc.getAttributeNames();
while(contextAttribNames.hasMoreElements()){
  String attribName = (String) contextAttribNames.nextElement();
  String attribValue = (String) sc.getAttribute(attribName);//Line#21
  out.println("<b>" + attribName + ":</b> " + attribValue + "<br>");
}

它只是尝试获取与应用程序/上下文范围相关的所有属性并打印它们的值。

代码编译正常,但是当我从url模式

调用此servlet时失败

以下是我得到的错误

“HTTP状态500 - org.apache.catalina.core.DefaultInstanceManager无法强制转换为java.lang.String”

java.lang.ClassCastException:org.apache.catalina.core.DefaultInstanceManager无法强制转换为java.lang.String     com.servlet.scopes.GetContextScopeServlet.doGet(GetContextScopeServlet.java:21)     javax.servlet.http.HttpServlet.service(HttpServlet.java:621)     javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

根据文档,javax.servlet.ServletContext有一个方法来获取具有以下签名的属性 public Object getAttribute(String attribName)

这就是为什么我要在#21行转换为String

的原因

请帮助我理解问题并解决问题...

环境详情: 操作系统 - Windows7 服务器 - Apache Tomcat 7.x. JavaEE-6规范

2 个答案:

答案 0 :(得分:1)

属性不一定都是String类型。它们可以是任何对象类型。但是你试图将它们全部用作String个对象

String attribValue = (String) sc.getAttribute(attribName);//Line#21

你不知道他们的类型,所以你可以做到

Object attribValue = sc.getAttribute(attribName);//Line#21

答案 1 :(得分:0)

ServletContext中的属性并不总是String个对象;它们可以是任何东西,通常是数据库池之类的项目。您几乎不应该将对象强制转换为String;相反,将Enumeration正确地参数化为Enumeration<String>,并在属性值上使用toString(),或者在字符串连接中使用裸Object以使编译器调用{{} 1}}含蓄地。