Java Spring - problem z przesyłaniem obiektu z pliku HTML do metody

Odpowiedz Nowy wątek
2018-11-18 15:37

Rejestracja: 2 lata temu

Ostatnio: 1 rok temu

0

Witam. Robię prosty projekt w Springu. Na jednej stronie mam listę kategorii. Chciałbym po kliknięciu na link z nazwą kategorii przejść do szablonu wyświetlającego elementy należące do tej kategorii. Mój problem polega na tym, że pojawia mi się w przeglądarce błąd:

Error during execution of processor 'org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor' (template: "home" - line 30, col 41)

Chciałbym prosić o pomoc w znalezieniu błędu w kodzie. Z góry dziękuję za każdą pomoc.

To jest mój kod w Javie:

@GetMapping("/")
public String homePage( Model model )
{
    List<Category> allCategories = categoryRepository.findAll();
    model.addAttribute("categories", allCategories);
    return "home";
}

@RequestMapping("/singleCategory")
    public String singleCategory( Category category, Model model )
    {
        model.addAttribute( "category", category );
        return "singleCategoryH";

    }

A tutaj plik HTML:

<table>
    <thead>
    <tr>
        <th>Category</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="c: ${categories}">

        <td>
            <form th:action = "@{/singleCategory}" th:object ='${category}'  method="post">
                <input type = "hidden"  th:field = "*{name}" value="${c.name}"> <!--30 linijka-->
                <input type = "hidden" th:field = "*{id}"  value="${c.id}">
                <button type="submit" class="btn btn-link">
                    <span th:text="${c.name}"></span>
                </button>
            </form>
        </td>

    </tr>
    </tbody>
</table>
w kwestii formalniej, plik HTML nie ma jako taki zdolności wysyłania czegokolwiek do czegokolwiek, jest powiedzmy "martwy", jest "tylko" plikiem. Ewentualne zdolności uzyskuje w środowisku, które go umie "ożywić", np uczyni z niego "stronę" - AnyKtokolwiek 2018-11-18 18:01

Pozostało 580 znaków

2018-11-18 16:59

Rejestracja: 2 lata temu

Ostatnio: 13 godzin temu

0

Może pokaż jeszcze tę klasę Category?

edytowany 1x, ostatnio: Baniowy, 2018-11-18 16:59

Pozostało 580 znaków

2018-11-18 17:05

Rejestracja: 2 lata temu

Ostatnio: 1 rok temu

0

Dorzucam klasę Category:

@Entity
public class Category {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(unique = true)
    private String name;
    @OneToMany
    @JoinColumn(name = "category_id")
    private List <Recipe> recipes;

    public List<Recipe> getRecipes() {
        return recipes;
    }

    public void setRecipes(List<Recipe> recipes) {
        this.recipes = recipes;
    }

    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 Category(String name) {
        this.name = name;
    }

    public Category() {
    }
}

Pozostało 580 znaków

Skromny Ogórek
2018-11-18 18:13
Skromny Ogórek
0

ciapek ' a ''?

Pozostało 580 znaków

2018-11-18 18:18

Rejestracja: 2 lata temu

Ostatnio: 13 godzin temu

1

W pliku html próbujesz się odwołać do obiektu category, którego nie ma w modelu:
<form th:action = "@{/singleCategory}" th:object ='${category}' method="post">

Albo dodaj go do modelu w kontrolerze albo usuń z pliku html. Dodatkowo usuń th:field i zostaw tylko th:value. Powinno działać.

Po usunięciu th:object nie mam już błędu, ale nie rozumiem o co chodzi z tym, że nie ma w modelu obiektu 'category'. Wydaje mi się w metodzie 'singleCategory' dodaję właśnie ten obiekt do modelu, ale pewnie robię to źle, bo ten obiekt jest zawsze nullem. Próbowałem dodawać 'category' do modelu w metodzie 'homePage', ale też jest zawsze nullem. - Tom8765 2018-11-18 18:52
Ale w metodzie singleCategory dodajesz obiekt category, który będzie dostępny na stronie zwracanej przez singleCategoryH czyli pewnie w tym przypadku singleCategoryH.html. W home.html masz w modelu tylko obiekt categories - Baniowy 2018-11-18 19:23
Czy w takim razie jest jakiś sposób na to, żeby na podstawie nazwy tekstu wyświetlanego jako link stworzyć obiekt, który odpowiadałby konkretnej encji w tabeli i przesłać go później do innego pliku html? - Tom8765 2018-11-18 19:44

Pozostało 580 znaków

2018-11-18 20:42

Rejestracja: 2 lata temu

Ostatnio: 13 godzin temu

Z tego co rozumiem to chcesz z pliku home.html przekazać do metody singleCategory obiekt pobrany z listy categories. Spróbuj tak:

  @GetMapping("/")
  public String homePage(Model model) {
    List<Category> allCategories = categoryRepository.findAll();
    model.addAttribute("category", new Category());
    model.addAttribute("categories", allCategories);
    return "home";
  }

  @PostMapping("/singleCategory")
  public String singleCategory(@ModelAttribute Category category, Model model) {
    model.addAttribute("category", category);
    return "singleCategoryH";
  }

natomiast w pliku home.html

<table>
    <thead>
    <tr>
        <th>Category</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="c: ${categories}">

        <td>
            <form th:action = "@{/singleCategory}" th:object ='${category}'  method="post">
                <input type = "hidden" th:value="${c.name}" name="name"> <!--30 linijka-->
                <input type = "hidden" th:value="${c.id}" name="id">
                <button type="submit" class="btn btn-link">
                    <span th:text="${c.name}"></span>
                </button>
            </form>
        </td>

    </tr>
    </tbody>
</table>
Dziękuję! O to właśnie mi chodził:) Działa. - Tom8765 2018-11-18 20:46

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0