Webkontroller

Mariexshhx

Bekanntes Mitglied
Hallo ich möchte bei einem Get-Request einfach ein Formular zurückgeben, kriege sber immer nen 404 und weiß nicht worsn es liegt. Kann mir jemand helfen? Mein Formular heißt Blut.html

HTML:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>Informationen der Person</h2>

<form method="post" >
  <div class="mb-3">
  <label for="id1">Geschlecht</label>
  <select name="geschlecht" id="id1">
    <option value="maennlich" checked="checked" >Männlich</option>
    <option value="maennlich">Weiblich</option>
  </select>
</div>
  <div class="mb-3">
    <label for="id2">Gewicht</label>
    <input type="text" name="kg" id="id2">
  </div>
  <div class="mb-3">
    <label for="1">Bier</label>
    <input type="number" name="bier" id="1">
    <label for="2">Wein</label>
    <input type="number" name="wein" id="2">
    <label for="3">Korn</label>
    <input type="number" name="korn" id="3">
    <label for="4">Vodka</label>
    <input type="number" name="vodka" id="4">
    <label for="5">Whisky</label>
    <input type="number" name="whisky" id="5">
  </div>
  <input type="submit" value="Senden">
</form>
</body>
</html>
Code:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller

public class WebController {

    @GetMapping("/")
        public String showform(){
        return "blut";
        }
}
 

Oneixee5

Top Contributor
Ich bin da kein Experte von Thymleaf aber ich sehe:
Blut.html und return "blut"; - da ist schon mal ein Unterschied bei Groß-/Kleinschreibung. Möglicherweise liegt dein Template auch nicht unter "src/main/resources/templates". Das ist aber Spekulation. Zeig doch mal die Fehlermeldungen/Log von Spring(Boot).
 

Mariexshhx

Bekanntes Mitglied
Ich bin da kein Experte von Thymleaf aber ich sehe:
Blut.html und return "blut"; - da ist schon mal ein Unterschied bei Groß-/Kleinschreibung. Möglicherweise liegt dein Template auch nicht unter "src/main/resources/templates". Das ist aber Spekulation. Zeig doch mal die Fehlermeldungen/Log von Spring(Boot).
eig heißt meine Datei blut.html wo siehst du Blut ?
 

Marinek

Bekanntes Mitglied
Dein Form sendet ein POST und du hast jedoch nur ein GET Mapping vorgesehen. Das sind zwei unterschiedliche und müssen zueinander passen.

Achso, du siehst das initiale Formular gar nicht.

Dann müsste eigentlich im Log stehen, warum nicht.

Wenn du nix im Log siehst, dann ist dein Context ggf. falsch. Wie wird die Anwendung gestartet? Und liegt deine Anwendung im ROOT Context? Oder ist ein abweichender konfiguriert?

Sicher, dass der Web-Controller korrekt gefunden wird? Was steht im Log, wenn du die Anwendung startest?
 

KonradN

Super-Moderator
Mitarbeiter
Kannst Du uns mehr Details geben?
  • Die SpringBoot Application class (Komplett zeigen mit package!)
  • In welchem Package ist Dein Controller?

Was mir einfällt ist halt, dass der Controller evtl. in der Spring Boot Applikation nicht da ist.

Und Du startest die Spring Boot Applikation als Stand Alone Applikation z.B. aus der IDE? (Dann wäre die Frage nach dem Context hinfällig - das wäre ja nur interessant, wenn es in einem Application Server laufen würde!)


eig heißt meine Datei blut.html wo siehst du Blut ?
Mein Formular heißt Blut.html
 

Mariexshhx

Bekanntes Mitglied
Kannst Du uns mehr Details geben?
  • Die SpringBoot Application class (Komplett zeigen mit package!)
  • In welchem Package ist Dein Controller?

Was mir einfällt ist halt, dass der Controller evtl. in der Spring Boot Applikation nicht da ist.

Und Du startest die Spring Boot Applikation als Stand Alone Applikation z.B. aus der IDE? (Dann wäre die Frage nach dem Context hinfällig - das wäre ja nur interessant, wenn es in einem Application Server laufen würde!)
Ich kriege keine Fehlermeldung und eig müsste es doch trotzdem gehen das Formular auszuliefern auch wenn die Methode post ist?
 

Anhänge

  • Bildschirmfoto 2022-12-04 um 23.58.24.png
    Bildschirmfoto 2022-12-04 um 23.58.24.png
    769,8 KB · Aufrufe: 4

KonradN

Super-Moderator
Mitarbeiter
Die Spring Boot Applikation kennt den Controller nicht, da dieser nicht unterhalb der Application liegt.

Spring Boot durchsucht den Classpath nach Elementen, die es verwalten soll (Spring Component Scanning). Dabei fängt es im Package der Application an und durchsucht dieses package und alle untergeordneten Packages.

Somit wird bei Dir nur com.example.alki durchsucht (und wenn es noch weitere packages darunter geben würde, würden diese auch durchsucht).

Du hast den Controller aber im package Web (package Namen sind in der Regel immer komplett klein geschrieben!).

Damit hat Spring Boot keinen Controller, der auf ein Get Request bei / hört und daher kommt es zu einem 404.

Einfache Lösung: Hab EINEN Namespace, in dem alles Andere liegt. In dem Namespace plazierst Du die SpringBoot Applikation. Alles Andere, das mit Spring Boot zu tun hat, legst Du unterhalb ab. Also z.B. die beiden anderen Namespaces einfach per Refactoring in com.example.alki verschieben (com.example.alki.web, com.example.alki.domain).
 

Mariexshhx

Bekanntes Mitglied
Die Spring Boot Applikation kennt den Controller nicht, da dieser nicht unterhalb der Application liegt.

Spring Boot durchsucht den Classpath nach Elementen, die es verwalten soll (Spring Component Scanning). Dabei fängt es im Package der Application an und durchsucht dieses package und alle untergeordneten Packages.

Somit wird bei Dir nur com.example.alki durchsucht (und wenn es noch weitere packages darunter geben würde, würden diese auch durchsucht).

Du hast den Controller aber im package Web (package Namen sind in der Regel immer komplett klein geschrieben!).

Damit hat Spring Boot keinen Controller, der auf ein Get Request bei / hört und daher kommt es zu einem 404.

Einfache Lösung: Hab EINEN Namespace, in dem alles Andere liegt. In dem Namespace plazierst Du die SpringBoot Applikation. Alles Andere, das mit Spring Boot zu tun hat, legst Du unterhalb ab. Also z.B. die beiden anderen Namespaces einfach per Refactoring in com.example.alki verschieben (com.example.alki.web, com.example.alki.domain).
vielen Dank für die Erklärung
 

Neue Themen


Oben