Ответ 1
Это проблема с IntelliJ: IDEA-132738.
В основном IntelliJ не может найти переменные модели, когда Spring Boot был использован для автоконфигурации всего.
Я пишу короткое приложение для веб-форм, используя spring boot и thymeleaf на IntelliJ, но кажется, что в 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 или просто проблема моего кода?
Это проблема с IntelliJ: IDEA-132738.
В основном IntelliJ не может найти переменные модели, когда Spring Boot был использован для автоконфигурации всего.
Вы можете использовать сочетание клавиш Alt + Enter, чтобы вызвать намерение "Объявить внешнюю переменную в аннотации комментария", чтобы избавиться от "неразрешенного атрибута модели" в ваших представлениях.
Добавьте следующий код в ваш html
файл:
<!--/* Workaround for bug https://youtrack.jetbrains.com/issue/IDEA-132738 -->
<[email protected] id="post" type="your.package.Post"-->
<[email protected] id="title" type="String"-->
<[email protected] id="content" type="String"-->
<!--*/-->
Если вы используете объекты расширений, созданные автоматически ThymeLeaf, такие как #temporals
из thymeleaf-extras-java8time
для преобразования объектов java.time
:
<span th:text="${#temporals.format(person.birthDate,'yyyy-MM-dd')}"></span>
и IntelliJ не может их разрешить, использовать похожий код и просто добавить #
перед именем объекта:
<[email protected] id="#temporals" type="org.thymeleaf.extras.java8time.expression.Temporals"-->
Статус 2017.3
Поддержка автоконфигурированных приложений MVC Spring Boot завершена, поддерживаются все связанные типы представлений автоконфигурации.
Версии исправлений: 2017.3
Я хочу добавить еще одну вещь. Как указано выше, проблема была исправлена в 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";
}
Итак, всегда убедитесь, что вы поместили свой код непосредственно в функцию просмотра!
В моем случае проблема заключалась в том, что у меня было следующее в application.properties:
spring.thymeleaf.prefix=file:src/main/resources/templates/
spring.thymeleaf.cache=false
После того, как я удалил эти свойства, Intellij снова обнаруживает сопоставления Spring mvc (в Ultimate-версии я использую 2018.1). Также объекты из тимьяна работают сейчас.
Я использовал эти свойства для поддержки быстрой разработки, при которой обновление будет перезагружать файлы шаблона тимили.
Чтобы решить эту проблему, я использую следующую опцию -D в моей конфигурации запуска моего приложения весенней загрузки, чтобы сообщить весенней загрузке, где находятся мои файлы свойств во время разработки:
-Dspring.config.location=/dev/application/conf/application.properties
Есть еще одна интересная ситуация: если вы НЕ возвращаете объект напрямую из вашего контроллера, Intellij не распознает переменную, но все равно будет работать
Включив его вручную, я работал в Intellij 2018.1.6 Ultimate Edition. Шаги следовали
Откройте окно инструмента Project (например, View | Tool Windows | Project).
Щелкните правой кнопкой мыши проект или папку модуля и выберите "Добавить поддержку платформы".
Официальная ссылка: https://www.jetbrains.com/help/idea/thymeleaf.html#0c8052be
У меня было две разные части кода: первая показывала ошибку, а вторая не делала этого. Я заметил, что есть разница в атрибуте 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. и это работает для меня!
Эта функция поддерживается только в версии Ultimate.
Нажмите здесь для более подробной информации