2016-08-02 51 views
8

Piszę krótką aplikację do tworzenia formularzy internetowych przy użyciu rozruchu sprężynowego i thymeleaf na IntelliJ, ale wygląda na to, że w pliku html nie można rozwiązać wszystkich pól w modelu. Tu jest mój kodu:Spring boot + thymeleaf w IntelliJ: nie mogę rozwiązać vars

klasa Kontroler:

@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"; 
    } 
} 

modelu Klasa:

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; 
    } 
} 

Wtedy to 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> 

Nie zawsze są czerwone linie poniżej " post "," title "i" content ", ale nie wiem jak go rozwiązać. Czy jest to problem z IntelliJ czy tylko z problemem mojego kodu?

+0

To powinno zostać naprawione w IntelliJ 2013.3, zobacz moją zredagowaną odpowiedź. –

Odpowiedz

12

To jest problem z IntelliJ: IDEA-132738.

Zasadniczo IntelliJ nie może zlokalizować zmiennych modelu, gdy Spring Boot został użyty do autokonfiguracji wszystkiego.

+1

Używam IntelliJ 2017.2 i ten problem nadal istnieje w IDE. To jest tak dominujące, gdy odwiedzam moje pliki html. Dlaczego faceci JetBrains jeszcze tego nie naprawili dla wsparcia Thymeleaf? – MAC

+0

@MAC To powinno zostać naprawione w IntelliJ 2013.3, zobacz moją zredagowaną odpowiedź. –

+0

Możemy tylko mieć nadzieję na najlepsze. W każdym razie dzięki !!! – MAC

8
  1. Jeśli wersja IntelliJ jest < 2017,3, to jest, jak Andrew wrote, znany błąd IDEA-132738. Istnieje sposób obejścia tego, jak pozbyć się znaków błędu w IDE. IntelliJ obsługuje również półautomatyczną generację poniżej wspomnianego kodu:

Można użyć Alt + Wprowadź skrót do powoływania się na intencję „Zadeklaruj zmienną zewnętrzną W komentarzu adnotacją” w celu pozbycia "nierozwiązany atrybut modelu" w swoich widokach.

Dodaj następujący kod do pliku html:

Jeśli używasz rozszerzenia obiektów skonstruowanej automatycznie przez ThymeLeaf, takich jak #temporals z thymeleaf-extras-java8time do przeliczenia java.time obiektów:

<span th:text="${#temporals.format(person.birthůDate,'yyyy-MM-dd')}"></span> 

i IntelliJ nie może ich rozwiązać, użyć podobnego kodu i po prostu dodać przed nazwiskiem obiektu #:

<[email protected] id="#temporals" type="org.thymeleaf.extras.java8time.expression.Temporals"--> 
  1. Jeśli wersja IntelliJ wynosi> = 2017,3, kwestia ta powinna być ustalona (@FloatOverflow: „Potwierdzam, że w wersji 2017,3 budować 25.Oct.2017 się problem został rozwiązany "):

Stan 2017,3

Wsparcie dla wiosennego Boot autokonfigurowana aplikacji MVC jest kompletny, wszystkie typy autokonfiguracji widok wiązane są obsługiwane.

Wersje poprawek: 2017.3

+0

Potwierdzam, że w wersji 2017.3 build 25.Okt.2017 problem został rozwiązany! – FloatOverflow

+1

@FloatOverflow Pracuję w wersji 2017.3, a moje obiekty są nadal podkreślone. Masz pojęcie, co robię źle? Na przykład w poniższym kodzie zarówno 'test' jak i' nazwa' są podkreślone. '

' – justinraczak

+0

@justinraczak Polecam Ci utworzyć przykład minimalny, kompletny i sprawdzalny (https : //stackoverflow.com/help/mcve) i zgłoś to do Jetbrains. Możesz dodać go do wyżej wymienionego problemu lub utworzyć nowy. –

1

Chcę dodać jeszcze jedną rzecz. Jak wspomniano powyżej, problem został rozwiązany w IntelliJ 2017.3. Mogę to również potwierdzić.

Zauważyłem jednak, że jest to prawdą tylko wtedy, gdy zdefiniujesz wszystkie atrybuty bezpośrednio wewnątrz funkcji odpowiedzialnego kontrolera, np. to:

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

Jeśli używasz podrzędną funkcję w którym można zdefiniować model atrybutów (patrz Przykład poniżej), IntelliJ nadal nie może znaleźć atrybuty szablonu HTML.

Przykład:

@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"; 
} 

Tak, zawsze upewnij się umieścić swój kod bezpośrednio wewnątrz funkcji widoku!

+0

I/lub jeśli Twoje RequestMappings są w Kotlin, IDE nie widzi atrybutów podobnie jak przy użyciu metody prywatnej. –