[java] javax.el.PropertyNotFoundException: Property 'id' not found on type bean.Student

问题提出:

在使用MyEclipse开发Java Web时,调用
DAO和Java Bean出现了如下错误:

严重: Servlet.service() for servlet [jsp] in context with path [/JDBCbyDao] threw exception [An exception occurred processing JSP page /student.jsp at line 37
34:
35: <c:forEach items="${ studentList }" var="student">
36: <tr bgcolor="#FFFFFF">
37: <td><input type="checkbox" name="id" value="${ student.id }" /></td>
38: <td>${ student.id }</td>
39: <td>${ student.name }</td>
40: <td>${ student.password }</td>
Stacktrace:] with root cause
javax.el.PropertyNotFoundException: Property 'id' not found on type bean.Student
at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:290)
at javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:243)




其中我的类中已经定义了属性和get/set方法,如下:
package bean;

public class Student {
	
	private Integer id;       //学号
	private String name;      //姓名
	private String password;  //密码
	
	public Integer getID() { return id; }
	public String getName() { return name; }
	public String getPassword() { return password; }
	public void setID(Integer id) { this.id =  id; }
	public void setName(String name) { this.name =  name; }
	public void setPassword(String pwd) { this.password = pwd; }
	
}
而Jsp中的调用代码是通过EL实现,也导入了相应的包。如下:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:directive.page import="DAO.StudentDAO"/>
<jsp:directive.page import="java.util.List"/>
<%
	List studentList = StudentDAO.listStudents();
	request.setAttribute("studentList", studentList);
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'student.jsp' starting page</title>
  </head>
  <body>
    <form action="operateStudent.jsp" method=get>
			<table bgcolor="#CCCCCC" cellspacing=1 cellpadding=5 width=100%>
				<tr bgcolor=#DDDDDD>
					<th>选择</th>
					<th>学号</th>
					<th>姓名</th>
					<th>密码</th>
					<th>操作</th>
				</tr>
				
				<c:forEach items="${studentList}" var="stu">
					<tr bgcolor="#FFFFFF">
						<td><input type="checkbox" name="id" value="${stu.id}" /></td>
						<td>${stu.id}</td>
						<td>${stu.name}</td>
						<td>${stu.password}</td>
						<td>
							<a href="addEmployee.jsp?action=edit&id=${stu.id}">修改</a>
							<a href="addEmployee.jsp?action=del&id=${stu.id}" 
								onclick="return confirm('确定删除?')">删除</a>
						</td>
					</tr>
				</c:forEach>
			</table>
		</form>
  </body>
</html>


解决方案:

1.可能你遇到的错误是“Property 'id' not found on type java.lang.String”异常
它的意思是String类中没有id这个属性,而修改的方法就是:
<c:forEach items="videos" var="video" >  
修改成:
<c:forEach items="${videos}" var="video" >

但是你需要注意它的错误是: java.lang.String对比type bean.Student,其中对应src/bean.Student.java文件。而且我在JSP中已经是${studentList}这种变量了,所以该方法不是该错误的解决方案。

2.有人说是bean的属性名称错误,或者没有get,set方法,但是我的bean如下方法。又参考错误“javax.el.PropertyNotFoundException: Property 'pNum' not found on type com.manager.Paper”,此时的解决方案是:
private int pNum;
private int pSize;
建议你将这两个属性的名称换下
private int pnum;
private int psize;
据说是应为命名规范,同时stu.EmpNo估计是大小写错了,换成 ${stu.empNo} 就能成功,因为EL是读取属性的getter方法的,一般按照属性首字母小写来处理。但是我的名字是id,因此该方法也是行不通的。

3.如果上面两个方法你仍然报错,下面是我自己总结的方法:
Servlet.service() for servlet [jsp] in context with path
javax.el.PropertyNotFoundException: Property 'id' not found on type bean.Student
你需要做到的是:

(1).首先确保循环<c:forEach items="${studentList}" var="stu">,然后调用是${stu.id}、${stu.name};
(2).然后属性命名最好是小写的,当然首字母一定要小写,如empNo;
(3).在数据库中create table student( stuid int,username varchar(20) )对应的Student类变量private Integer id; private String name;其中类型需要一致,同时设置get和set方法:

private Integer id;       //学号
private String name;      //姓名
public Integer getID() { return id; }
public String getName() { return name; }
public void setId(Integer id) { this.id =  id; }
public void setName(String name) { this.name =  name; }
(4).在DAO中数据库增删改查操作中类型要一致,并且对应数据库中的学号stuid和姓名username:
        //删除操作
        public static int delete(Integer id) throws Exception {
            String sql = "DELETE FROM student WHEREstuid = ? ";
            return JDBCConnect.executeUpdate(sql, id);
        }
        //查询操作
        student.setId(rs.getInt("stuid"));      
        student.setName(rs.getString("username"));
(5).如果上面的数据库、Java类变量类型都是一致的,使用方法都正确仍然存在该错误,那可能就是下面的错误:
当我定义函数public Integer getID() { return id; }时就会报错

HTTP Status 500 - javax.el.PropertyNotFoundException: Property 'id' not readable on type bean.Student

而当我修改为public IntegergetId() { return id; }后运行结果如下图所示:


同样setId()方法也修改,同时DAO中调用setId()和getId()方法也修改“D=>d”。所以我还是怀疑是使用EL时的命名规范在作怪。而且我通过代码验证修改成小写d可以成功。而第一个错误Servlet.service() for servlet需要看它后面抛出的异常,即第二个错误。
另一种猜测:在jstl的el表达式引用错误应该使用${info.type.id } 而不是${info.id }(未验证)
参考资料:
1.JSP not finding property in bean - stackoverflow 丢失set方法
2.javax.el.PropertyNotFoundException: Property 'answer' not - stackoverflow
3.异常:javax.el.PropertyNotFoundException: Property 'id' not found on - 优快云
4.javax.el.PropertyNotFoundException: Property 'Owner' not found on - 百度知道
5.JSP没有使<c:forEach items="${specialty}" var="spe"> - 优快云论坛
该错误报告和在线笔记希望对你有所帮助~
(By:Eastmount 2015-5-19 凌晨4点   
http://blog.youkuaiyun.com/eastmount/
        


<think>我们正在处理一个Java EE中的异常:javax.el.PropertyNotFoundException: Property [name] not found on type [java.lang.String] 原因分析: 这个异常通常发生在使用EL表达式(Expression Language)访问一个对象的属性时,但该对象并没有这个属性。 具体来说,这里尝试访问一个String类型的对象的"name"属性,但是String类并没有一个叫做"name"的属性。 常见场景: 1. 在JSP或者Facelets页面中,我们可能会写这样的EL表达式:${someString.name},而这里的someString是一个字符串对象。 但是String类只有一些标准的方法(如length, substring等),并没有一个名为"name"的属性(即没有getName()方法或者公共字段name)。 2. 可能你期望的是一个具有name属性的对象,但实际上传递的是一个String对象。 可能的原因: 1. 在某个地方,你错误地将一个String类型的对象赋值给了一个本应该是一个自定义对象的变量。 例如,在Servlet中设置属性:request.setAttribute("user", "John Doe"); 然后在JSP中:${user.name} -> 这里"user"是一个字符串,而不是一个具有name属性的对象。 2. 你可能在EL表达式中使用了错误的变量名,或者变量名冲突导致实际取到的是一个字符串。 3. 可能你访问的是数组或集合中的元素,但该元素是字符串,而你却试图访问它的属性。 例如:${userList[0].name},而userList[0]实际上是一个字符串。 解决方法: 1. 检查设置属性的代码(如Servlet、Controller等),确保将正确类型的对象放入作用域(request, session, application等)。 2. 检查EL表达式中的变量名是否正确,确保它引用的是你期望的对象。 3. 如果这个字符串确实包含了你需要的信息,并且你只是想要这个字符串本身,那么直接使用${someString}即可,而不需要访问.name。 4. 如果你需要从字符串中获取某些信息(如长度),可以使用EL函数或者将该字符串包装在一个具有属性的对象中。 例如,如果你需要字符串的长度,可以使用: ${fn:length(someString)} 但是需要在页面中引入函数库:<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 5. 如果你期望的是一个自定义对象,那么请检查生成该对象的代码,确保它被正确创建和设置。 示例: 错误代码: 在Servlet中: request.setAttribute("user", "Alice"); // 这里设置了一个字符串 在JSP中:<div>${user.name}</div> // 这里会抛出异常,因为字符串没有name属性 修正: 应该设置一个具有name属性的对象: public class User { private String name; // getter and setter } User user = new User(); user.setName("Alice"); request.setAttribute("user", user); 或者,如果只是想要显示字符串,那么直接使用:${user} 根据要求,在回答最后提出3-5个相关问题,以“§§相关问题§§”开头,然后列出问题。 </think> ### 原因分析: `javax.el.PropertyNotFoundException: Property [name] not found on type [java.lang.String]` 异常表示 EL 表达式(Expression Language)尝试访问 **`java.lang.String` 类型对象的 `name` 属性,但 `String` 类不存在该属性**。常见原因包括: 1. **错误的对象类型** 期望访问一个自定义对象(如 `User.name`),但实际传入的是一个 `String` 对象(例如 `"user123"`)。 **示例错误代码**: ```java request.setAttribute("user", "Alice"); // 传入的是 String ``` ```jsp ${user.name} <!-- 试图访问 String 的 name 属性 --> ``` 2. **EL 表达式语法错误** 错误地使用属性访问符(`.`)访问字符串内容,而非直接输出字符串。 **错误示例**: `${username.name}`(`username` 是字符串,无属性)。 3. **集合/数组元素类型错误** 尝试访问集合中字符串元素的属性(如 `${userList[0].name}`,但 `userList[0]` 是 `String` 类型)。 4. **空值或未初始化对象** 变量为 `null` 时,EL 默认不报错,但若后续操作涉及属性访问(如 `${obj.name}` 中 `obj` 为 `String`)会抛出异常。 --- ### 解决方法: 1. **检查作用域变量类型** 确保传入的是自定义对象(如 `User`),而非字符串: ```java // Servlet 中正确设置对象 User user = new User("Alice"); // User 类有 getName() 方法 request.setAttribute("user", user); ``` JSP 中正确访问: ```jsp ${user.name} <!-- 调用 user.getName() --> ``` 2. **直接输出字符串** 若只需显示字符串,直接使用变量名: ```jsp ${username} <!-- 而非 ${username.name} --> ``` 3. **使用 EL 函数处理字符串** 如需字符串操作(如长度),用 JSTL 函数: ```jsp <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> ${fn:length(username)} ``` 4. **调试技巧** - 输出变量类型: `${pageContext.request.getAttribute('user').getClass().name}` - 检查是否为 `null`: `${user == null ? 'null' : 'not null'}`
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eastmount

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值