You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:24:34