我正在使用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的问题还是我的代码问题?
答案 0 :(得分:15)
这是IntelliJ的一个问题:IDEA-132738。
基本上,当使用Spring Boot自动配置所有内容时,IntelliJ无法找到模型变量。
答案 1 :(得分:15)
您可以使用 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>
:
#
状态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中对我有用。遵循的步骤
打开“项目”工具窗口(例如“视图” |“工具窗口” |“项目”)。
右键单击项目或模块文件夹,然后选择添加 框架支持。
官方参考:https://www.jetbrains.com/help/idea/thymeleaf.html#0c8052be
答案 7 :(得分:0)
答案 8 :(得分:-2)
此功能仅在Ultimate版本中受支持。
Click here了解更多详情