javax.el.PropertyNotFoundException: Property 'Name' not found on type com.min.test.User

本文详细解析了在使用Apache Tomcat和JSP开发过程中遇到的JasperException错误,特别是关于PropertyNotFoundException的问题。通过分析request.setAttribute()方法的使用,解释了错误产生的原因,并提供了相关实体类字段命名规范的建议。

错误

org.apache.jasper.JasperException: javax.el.PropertyNotFoundException: Property 'Name' not found on type com.min.test.User
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:556)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:477)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    com.min.test.TestDome.doGet(TestDome.java:35)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

引起错误的原因

request.setAttribute("user",user); 

user.java

package com.min.test;

public class User {
    private String Name;
    private String Password;


    public User(String name, String password) {
        Name = name;
        Password = password;
    }

    public String getName() {
        return Name;
    }
    public void setName(String name) {
        Name = name;
    }
    public String getPassword() {
        return Password;
    }
    public void setPassword(String password) {
        Password = password;
    }

}

这里写图片描述

错误原因就是传递的实体类字段大写

### 问题分析 `javax.el.PropertyNotFoundException` 异常通常发生在使用EL表达式(Expression Language)时,尝试访问一个对象的属性而该属性不存在的情况下。根据提供的信息,异常表明在`java.lang.String`类型上找不到名为`roleName`的属性[^4]。 在Java中,`String`是一个不可变类,并且没有定义任何自定义的getter或setter方法。因此,当EL表达式尝试解析`roleName`属性时,它会抛出`PropertyNotFoundException`异常,因为`String`类中不存在这样的属性。 --- ### 解决方案 #### 1. 检查数据模型 确保传递给视图的数据模型是正确的。如果期望访问`roleName`属性,则需要确保对应的对象确实包含该属性。例如,如果期望的对象是一个自定义类`User`,则需要确认`User`类中定义了`roleName`属性以及其getter方法: ```java public class User { private String roleName; public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } } ``` 如果传递的是`String`类型的值而不是`User`对象,则会导致上述异常[^5]。 --- #### 2. 检查视图层代码 在JSP或其他视图模板中,确保正确引用了模型中的对象。例如,如果模型中存储了一个`User`对象,则应该通过以下方式访问`roleName`属性: ```jsp ${user.roleName} ``` 如果模型中存储的是一个字符串值,则需要重新设计模型,确保传递的是包含`roleName`属性的对象,而不是简单的字符串。 --- #### 3. 调试与验证 在控制器或服务层中打印传递给视图的数据模型,确保其类型和内容符合预期。例如: ```java @Controller public class UserController { @GetMapping("/user") public String getUser(Model model) { // 错误示例:传递了一个字符串 // model.addAttribute("user", "admin"); // 正确示例:传递一个包含 roleName 属性的对象 User user = new User(); user.setRoleName("admin"); model.addAttribute("user", user); return "userView"; } } ``` --- #### 4. 使用工具类进行类型检查 如果不确定传递给视图的对象类型,可以使用反射工具类进行调试。例如: ```java import java.lang.reflect.Method; public class ReflectionUtils { public static boolean hasProperty(Object obj, String propertyName) { if (obj == null || propertyName == null) { return false; } try { Method method = obj.getClass().getMethod("get" + capitalize(propertyName)); return method != null; } catch (NoSuchMethodException e) { return false; } } private static String capitalize(String str) { if (str == null || str.isEmpty()) { return str; } return str.substring(0, 1).toUpperCase() + str.substring(1); } } ``` 可以通过以下方式调用工具类进行类型检查: ```java if (!ReflectionUtils.hasProperty(user, "roleName")) { throw new IllegalArgumentException("Object does not have property 'roleName'"); } ``` --- ### 注意事项 - 如果模型中传递的是`String`类型的值,则无法通过EL表达式访问`roleName`属性,因为`String`类中不存在该属性。 - 确保模型中传递的对象类型与视图层的引用一致。 - 如果使用了Spring框架,则需要检查`@ModelAttribute`注解是否正确配置了数据绑定逻辑。 --- ### 示例代码 以下是一个完整的示例,展示如何正确传递模型并访问属性: ```java @Controller public class RoleController { @GetMapping("/role") public String showRole(Model model) { Role role = new Role(); role.setRoleName("Admin"); model.addAttribute("role", role); return "roleView"; } } public class Role { private String roleName; public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } } ``` 在JSP页面中: ```jsp ${role.roleName} ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值