• 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'

Object Storage Arubacloud
0 głosów
3,813 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,155 wizyt
pytanie zadane 28 lutego 2018 w Java przez Tomek Reda Obywatel (1,110 p.)
0 głosów
1 odpowiedź 1,195 wizyt
pytanie zadane 7 lutego 2018 w Java przez niezalogowany

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...