• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

spring boot- Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor'

VPS Starter Arubacloud
0 głosów
3,790 wizyt
pytanie zadane 7 czerwca 2019 w Java przez klawir Nowicjusz (180 p.)

Dzień dobry,

Próbuję zrobić prosty przycisk, który będzie zapisywac wpisane słowa z pola tekstowego do listy, a po przejsciu do /results wyswietli mi te wprowadzone dane.

main.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<BODY>
<form action="#" th:action="@{/}" th:object="${achievement}" method="post">
    <input type="text" th:field="*{name}"/>
    <input type="submit" name="action" value="save" />
    <input type="submit" name="action" value="show" />
</form>
</BODY>
</html>

 

@Entity
public class Achievement {
    @Id
    @GeneratedValue
    private Long id;

    private String token;

    @GeneratedValue
    @Column(nullable = false)
    private String name;

    private String description;

    public Achievement(String name) {

        this.name = name;
    }

    @ManyToOne
    private Game game;

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Game getGame() {
        return game;
    }

    public void setGame(Game game) {
        this.game = game;
    }
}

 

@Controller
@RequestMapping("/")
public class Controler {

    @Autowired
    private Manager manager;

    @GetMapping("/")
    public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
        model.addAttribute("name", name);
        return "main";
    }

    @RequestMapping(value="/", method = RequestMethod.POST)
    public String greetingSubmit(@ModelAttribute Achievement achievement, HttpSession session) {
        String names = (String) session.getAttribute("names");
        if (names == null) {
            session.setAttribute("names", names);
        }
        manager.getAchievementList().add(new Achievement(names));
        return "main";
    }
}

 

@RestController
public class ResControler {

    @Autowired
    private Manager manager;

    @GetMapping("/results")
    public List<Achievement> achievementList() {
        return manager.getAchievementList();
    }
}

 

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Jun 07 13:12:04 CEST 2019
There was an unexpected error (type=Internal Server Error, status=500).
Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "main" - line 10, col 24)

Co jest źle?

1
komentarz 8 czerwca 2019 przez Mateusz51 Nałogowiec (28,180 p.)
Stack trace wskazuje, że masz bład w szablonie thymeleaf 'main' w 10 linijce

3 odpowiedzi

+1 głos
odpowiedź 8 czerwca 2019 przez mbabane Szeryf (79,280 p.)

Wskazuje błąd tutaj:

<form action="#" th:action="@{/}" th:object="${achievement}" method="post">
    <input type="text" th:field="*{name}"/>

ponieważ w modelu nie ma obiektu achievement. Wyrażenie *{name} odwołuje się do pola obiektu zdefiniowanego w th:object

Dodawanie obiektu możesz zrobić np. tak:

    @GetMapping("/")
    public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
        model.addAttribute("name", name);
        model.addAttribute(new Achievement());
        return "main";
    }

 

komentarz 9 czerwca 2019 przez klawir Nowicjusz (180 p.)

Zmodyfikowałem plik:

@Controller
@RequestMapping("/")
public class Controler {

    @Autowired
    private Manager manager;

    @GetMapping("/")
    public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
        model.addAttribute("name", name);
        model.addAttribute(new Achievement(name));
        return "main";
    }
}

 

rezultat:

 

komentarz 9 czerwca 2019 przez mbabane Szeryf (79,280 p.)
musisz zerknac na stacktrace w logach aplikacji
0 głosów
odpowiedź 8 czerwca 2019 przez miro Pasjonat (23,870 p.)
Spróbuj skasować value="/" wraz z @RequestMapping("/") tworzysz endpoint "//". Najlepiej jednak to nie twórz endpointa "/" tylko nazwij go jakoś np. "/achievements".
Zamiast @RequestMapping(value="/", method = RequestMethod.POST) możesz użyć @PostMapping. To się też dotyczy innych metod.
0 głosów
odpowiedź 9 czerwca 2019 przez Aisekai Nałogowiec (42,190 p.)

Łatwiej będzie Ci chyba wywalić:

th:object="${achievement}"

Thymeleaf powinien już sobie poradzić gdy wartość th:name (albo th:text, nie pamiętam już) będzie odpowiadać nazwie pola i przerobić jsona na obiekt. 

Nie potrzebna masz też adnotacje @ModelAttribute przy Achievment - mi przechodziło to bez tej adnotacji.

Ps: Nie wstrzykuj przez pole, dużo lepiej przez konstruktor. 

Podobne pytania

0 głosów
3 odpowiedzi 1,123 wizyt
pytanie zadane 28 lutego 2018 w Java przez Tomek Reda Obywatel (1,110 p.)
0 głosów
1 odpowiedź 1,191 wizyt
pytanie zadane 7 lutego 2018 w Java przez niezalogowany

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...