【问题标题】:Exception evaluating SpringEL with Spring MVC使用 Spring MVC 评估 SpringEL 的异常
【发布时间】:2018-05-09 05:45:21
【问题描述】:

我开始使用 Spring MVC,但遇到了麻烦。我想用键获取哈希图的值。对象 ProtoStatus 包含一个我想要获得价值的哈希图。我有这个错误:

org.thymeleaf.exceptions.TemplateProcessingException:异常 评估 SpringEL 表达式:“protoStatus.status.get(30000)” (模板:“protoStatusPage” - 第 18 行,第 21 列)

public class ProtoStatus
{
    public HashMap<String, String> status;

    public void computeStatus()
    {
        this.status = new HashMap();

        for (int i=30000; i<30032; i++)
        {
            this.status.put(String.valueOf(i), String.valueOf(ServerChecker.Check("192.168.0.1", i)));
        }
    }

    public void setStatus(HashMap status)
    {
        this.status = status;
    }

    public HashMap getStatus()
    {
        return this.status;
    }

    public String getStatus(int key)
    {
        return (String) this.status.get(key);
    }
}

Spring MVC 部分:

@PostMapping("/")
    public String submit(@ModelAttribute User user, @ModelAttribute ProtoStatus protoStatus)
    {
            protoStatus = new ProtoStatus();
            protoStatus.computeStatus();
            return "protoStatusPage";
    }

最后,在模板 protoStatusPage.html 中,我想获取键 30000 的值:

<p th:text="${protoStatus.status.get(30000)}" />

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

    您的状态属性默认为空。只有当您调用computeStatus() 时,它才会变为非空。但是您永远不会在视图使用的 ProtoStatus 上调用它:

            protoStatus = new ProtoStatus();
            protoStatus.computeStatus();
    

    相反,您创建一个不同的,并在那个上调用 computeStatus(),然后立即有资格进行垃圾收集。

    另外,你有一个Map&lt;String, String&gt;,但是你的getStatus() 方法和你视图中的表达式,试图使用整数类型的键从中获取一些东西。这将始终返回 null。

    【讨论】:

    • 你是对的,我犯了两个错误,现在可以正常工作了,谢谢你的帮助
    【解决方案2】:

    您的 HashMap&lt;String,String&gt; 包含两个 String 对象。所以你必须调用使用

    替换这一行

    <p th:text="${protoStatus.status.get(30000)}" />
    

    <p th:text="${protoStatus.status.get('30000')}" />
    

    【讨论】: