2017-09-22 2 views
-1

Der Versuch, die Variable bei der Formularübergabe an die Ergebnisseite zu übergeben, gibt jedoch jedes Mal null zurück. Egal wie viele Variationen ich ausprobiert habe.Platzhalter in Thymeleaf-Vorlage kann nicht in Null gefunden werden

So Karte Ich erhalte und Post für login.html:

@GetMapping("/login") 
public String greetingForm(Model model) { 
    model.addAttribute("User2", new User()); 
    return "login"; 
} 
@PostMapping("/login") 
public String greetingSubmit(@ModelAttribute User regUser) { 
    //userRepository.save(regUser); 
    //String teststr = regUser.getName(); 
    //System.out.println(teststr); 
    return "result"; 
} 

tatsächlich sieht login.html wie folgt aus:

<!DOCTYPE HTML> 
<html xmlns:th="http://www.thymeleaf.org"> 
<head> 
    <title>Getting Started: Handling Form Submission</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
</head> 
<body> 
    <h1>Form</h1> 
    <form action="#" th:action="@{/demo/login}" th:object="${User2}" method="post"> 
     <p>Username: <input type="text" th:field="*{name}" /></p> 
     <p>Password: <input type="text" th:field="*{password}" /></p> 
     <p>Balance: <input type="text" th:field="*{balance}" /></p> 
     <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p> 
    </form> 
</body> 
</html> 

Teil der User.java Datei:

@Entity // This tells Hibernate to make a table out of this class 
public class User { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer id; 

    private String name; 

    private String password; 

    private int balance; 

    public int getBalance() { 
     return balance; 
    } 

    public void setBalance(int balance) { 
     this.balance = balance; 
    } 

    public Integer getId() { 
     return id; 
    } 

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

    public String getName() { 
     return name; 
    } 

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

und das Ergebnis.html ist:

<!DOCTYPE HTML> 
<html xmlns:th="http://www.thymeleaf.org"> 
<head> 
    <title>Getting Started: Handling Form Submission</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
</head> 
<body> 
    <h1>Result</h1> 
    <p th:text="'username: ' + ${User.name}" /> 
    <p th:text="'password: ' + ${regUser != null ? regUser.password : 'NOT FOUND'}" /> 
    <p th:text="'balance: ' + ${model != null ? regUser.balance : 'NOT FOUND'}" /> 
    <a href="/demo/login">Submit another user?</a> 
</body> 
</html> 

Es hält immer wieder eine Null-Fehler auf dieser Linie zu werfen:

<p th:text="'username: ' + ${User.name}" /> 

speziell ${User.name}, die wie

org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'name' cannot be found on null

So sieht Ich habe alles versucht habe ich kann denken von,

${User2.name} 
${User} 
${User2} 
${regUser.name} 
${teststr} 
${#User.name} 

etc ....

Es ist sehr seltsam, wenn ich System.out.println(regUser.getName()); Kommentar- werden es den Namen des Benutzers ganz gut drucken, aber nicht die Variable übergeben. Ist es mein Platzhalter oder kann es nicht als th:text übergeben werden, weil es ein User Objekt ist? Bitte helfen Sie mir, ich bin sehr verwirrt!

Edit: Tutorial folgte ich (https://spring.io/guides/gs/handling-form-submission/) Wenn Sie das Tutorial kopieren, funktioniert es gut, aber es gibt nur eine Zeichenfolge. Obwohl User.name eine String-Variable wäre ...

Antwort

0

@ModelAttribute hat ein Element mit dem Namen name. Seine Javadoc-Status

Der Name des Modellattributs zu binden.

Der Standardmodellattributname wird aus dem deklarierten Attributtyp (das heißt der Verfahren Parametertyp oder Methode Rückgabetyp), auf den nicht-qualifizierten Klassennamen basierte abgeleitet: z.B. "orderAddress" für Klasse "mypackage.OrderAddress" oder "orderAddressList" für "List<mypackage.OrderAddress>".

Da Sie für dieses Element einen Wert angegeben haben, verwendet Spring MVC den Standardwert. Wie oben erwähnt, wird der Standardwert aus dem Typ Ihres Parameters abgeleitet, der User ist. Wenn Sie dem Beispiel folgen, lautet dieser Attributname daher user, nicht User.

Ihr Platzhalter lesen sollte

${user.name} 

Dies auch im Frühjahr Referenzdokumentation erklärt, here

Was passiert, wenn ein Modellname Attribut nicht explizit angegeben wird? In solchen Fällen wird dem Modellattribut basierend auf dem Typ ein Standardname zugewiesen. Wenn die Methode beispielsweise ein Objekt vom Typ Account zurückgibt, wird als Standardname "account" verwendet. Sie können diese durch den Wert der @ModelAttribute Annotation ändern. Wenn Sie Attribute direkt zu hinzufügen, verwenden Sie die entsprechende überladene Methode addAttribute(..) - d. H. Mit oder ohne Attributnamen.


In Ihrem @GetMapping Sie den Namen des Modells Attribut

explizit
model.addAttribute("User2", new User()); 

Sie das für Ihr @PostMapping Beispiel tun könnte auch

@PostMapping("/login") 
public String greetingSubmit(@ModelAttribute(name = "User") User regUser) {