Spring控制器自定义Java对象传入JSP无法渲染属性如何解决
问题根因
报错的核心原因是你定义的Post是HomeController的非静态内部类,不符合JSP EL表达式遵循的JavaBeans访问规范。
非静态内部类会隐式持有外部类实例的引用,EL的属性解析器无法通过反射正常识别类的getter方法,才会抛出Property [title] not readable的错误。你直接输出对象时看到的类名+哈希值字符串,是Object类默认toString()方法的返回结果,只代表对象确实传到了视图层,不代表属性可以被正常访问。
修复方法
两种改法都可以解决问题:
方法1:修改内部类修饰符
给内部类加上public static修饰符,让EL解析器可以正常访问类成员,原有getter方法不需要改动:
@Controller public class HomeController { // ... 其他原有代码不变 // 给Post类加public static修饰 public static class Post{ private String type; private String title; private String content; private String likes; public Post(String type, String title, String content, String likes){ this.type=type; this.title=title; this.content=content; this.likes=likes; } public String getType(){ return type; } public String getTitle(){ return title; } public String getContent(){ return content; } public String getLikes(){ return likes; } } // ... getList等其他原有代码不变 }
改完之后你原来的JSP代码不需要任何调整,${listValue.title}就可以正常输出对应属性值。
方法2(推荐):将Post定义为独立公共类
把Post类从HomeController中抽离,单独创建Post.java文件作为顶级公共类,这是业务开发的标准写法,可以避免内部类带来的各类访问权限问题:
// 单独存放的Post.java,包路径替换为你项目的实际路径 package com.luwojtaszek.springbootjsp.web.controller; public class Post { private String type; private String title; private String content; private String likes; public Post(String type, String title, String content, String likes){ this.type=type; this.title=title; this.content=content; this.likes=likes; } // 原有getter方法保留 public String getType(){ return type; } public String getTitle(){ return title; } public String getContent(){ return content; } public String getLikes(){ return likes; } }
适配JS处理的优化
如果你后续需要直接在前端通过JS操作这些数据,可以给Post类重写toString()方法,直接返回JSON格式字符串,就算JSP里直接写${listValue}也能输出可被JS直接解析的结构化内容:
// 在Post类中添加该方法 @Override public String toString() { return String.format("{\"type\":\"%s\",\"title\":\"%s\",\"content\":\"%s\",\"likes\":\"%s\"}", type, title, content, likes); }
内容的提问来源于stack exchange,提问作者Fantasy
相关产品推荐
相关产品推荐

