IntelliJ中的Spring boot + thymeleaf:无法解析变量

时间:2016-08-02 01:44:31

标签: java spring web intellij-idea thymeleaf

我正在使用IntelliJ上的spring boot和thymeleaf编写一个简短的Web表单应用程序,但似乎在html文件中,模型中的所有字段都无法解析。这是我的代码:

控制器类:

@Controller
public class IndexController{

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(){
        return "index";
    }

    @RequestMapping(value="/", method = RequestMethod.POST)
    public String addNewPost(@Valid Post post, BindingResult bindingResult, Model model){
        if(bindingResult.hasErrors()){
            return "index";
        }
        model.addAttribute("title",post.getTitle());
        model.addAttribute("content",post.getContent());
        return "hello";
    }
}

模特课程:

public class Post {

    @Size(min=4, max=35)
    private String title;

    @Size(min=30, max=1000)
    private String content;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

然后是index.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head lang="en">

    <title>Spring Framework Leo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>

<h3>Spring Boot and Thymeleaf</h3>


    <form action="#" th:action="@{/}"  th:object="${post}" method="post">
        <table>
            <tr>
                <td>Title:</td>
                <td><input type="text" th:field="*{title}" /></td>
                <td th:if="${#fields.hasErrors('title')}" th:errors="*{title}">Title error message</td>
            </tr>
            <tr>
                <td>Content:</td>
                <td><input type="text" th:field="*{content}" /></td>
                <td th:if="${#fields.hasErrors('content')}" th:errors="*{content}">Content error message</td>
            </tr>
            <tr>
                <td><button type="submit">Submit post</button></td>
            </tr>
        </table>
    </form>

“post”,“title”和“content”下总是有红线,但我不知道如何解决。这是IntelliJ的问题还是我的代码问题?

9 个答案:

答案 0 :(得分:15)

这是IntelliJ的一个问题:IDEA-132738

基本上,当使用Spring Boot自动配置所有内容时,IntelliJ无法找到模型变量。

答案 1 :(得分:15)

  1. 如果你的IntelliJ版本是&lt; 2017.3 ,它是Andrew wrote,已知错误IDEA-132738。有一种解决方法如何摆脱IDE中的错误标记。 IntelliJ还支持半自动生成下面提到的代码:
  2.   

    您可以使用 Alt + Enter 快捷方式调用意图“在注释注释中声明外部变量”,以便在视图中删除“未解析的模型属性”。

    将以下代码添加到html文件中:

    <!--/* Workaround for bug https://youtrack.jetbrains.com/issue/IDEA-132738 -->
        <!--@thymesVar id="post" type="your.package.Post"-->
        <!--@thymesVar id="title" type="String"-->
        <!--@thymesVar id="content" type="String"-->
    <!--*/-->
    

    如果您使用由ThymeLeaf自动构建的扩展程序对象,例如来自#temporals的{​​{1}}转换thymeleaf-extras-java8time个对象:

    java.time

    并且IntelliJ无法解析它们,使用类似的代码,只需在对象名称前添加<span th:text="${#temporals.format(person.birthDate,'yyyy-MM-dd')}"></span>

    #
    1. 如果你的IntelliJ版本是&gt; = 2017.3 (但是有些人抱怨它仍然无效),问题应该修复(@FloatOverflow:“我在2017.3版本中确认build 25.Oct.2017问题已解决“):
    2.   

      状态2017.3

           

      支持Spring Boot自动配置的MVC应用程序已完成,支持所有捆绑的自动配置视图类型。

           

      修正版本:2017.3

答案 2 :(得分:6)

我想再补充一点。如上所述,该问题已在 IntelliJ 2017.3 中修复。我也可以证实这一点。

但是,我注意到只有在负责的控制器功能中定义所有属性直接时才会出现这种情况,例如:这样:

@RequestMapping(value = "/userinput")
public String showUserForm(Model model){
    model.addAttribute("method", "post");
    model.addAttribute("user", new User());
    return "userform";
}

如果您使用的是定义模型属性的子功能(请参阅下面的示例),IntelliJ仍然无法在HTML模板中找到属性。

示例

@RequestMapping(value = "/userinput")
public String showUserForm(Model model){
    return doIt(model);
}

private String doIt(Model model) {
    model.addAttribute("method", "post");
    model.addAttribute("user", new User());
    return "userform";
}

因此,请始终确保将代码直接放在视图函数中!

答案 3 :(得分:2)

我有两个不同的代码部分:第一个显示错误,第二个没有执行。 我发现 xmlns:th 属性存在差异。

首页:不起作用!

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">

第二页:有效!

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://thymeleaf.org">

我删除了 www。,它对我有用!

答案 4 :(得分:1)

就我而言,问题是我在application.properties中有以下内容:

spring.thymeleaf.prefix=file:src/main/resources/templates/

spring.thymeleaf.cache=false

一旦我删除了这些属性,再次由Intellij检测到spring mvc映射(在Ultimate版本中,我使用的是2018.1)。百里香叶物体现在也在起作用。

我使用这些属性来支持快速开发,其中刷新将重新加载百万美元模板文件。

要解决此问题,我在Spring启动应用程序的运行配置中使用以下-D选项告诉spring boot在开发过程中我的属性文件所在的位置:

-Dspring.config.location=/dev/application/conf/application.properties

答案 5 :(得分:0)

还有另一种有趣的情况,如果您不直接从控制器返回对象,Intellij将无法识别该变量,但她仍然可以工作

答案 6 :(得分:0)

手动启用它,在Intellij 2018.1.6 Ultimate Edition中对我有用。遵循的步骤

  1. 打开“项目”工具窗口(例如“视图” |“工具窗口” |“项目”)。

  2. 右键单击项目或模块文件夹,然后选择添加     框架支持。

  3. 在“添加框架”的左侧窗格中     打开支持对话框,选中Thymeleaf复选框。

官方参考:https://www.jetbrains.com/help/idea/thymeleaf.html#0c8052be

答案 7 :(得分:0)

这个问题来自 thymeleaf 网页链接。

问题:xmlns:th="http://www.thymeleaf.org"

This is problem link:

This is error area:

解决办法:xmlns:th="http://thymeleaf.org"

Solution link

Error is gone

答案 8 :(得分:-2)

此功能仅在Ultimate版本中受支持。

Click here了解更多详情