簡體   English   中英

Spring驗證注釋不顯示錯誤消息

[英]Spring validation annotations not displaying error messages

嗨,這是我的第一個問題

我是SPRING的新手。目前,我正在使用批注進行春季驗證

這是我的DAO班

public class User {

    @NotBlank(message="Username cannot be blank.")
    @Size(min=8, max=15, message="Username must be between 8 and 15 characters long.")
    @Pattern(regexp="^\\w{8,}$", message="Username can only consist of numbers, letters and the underscore character.")
    private String username;

    @NotBlank(message="Password cannot be blank.")
    @Pattern(regexp="^\\S+$", message="Password cannot contain spaces.")
    @Size(min=8, max=15, message="Password must be between 8 and 15 characters long.")
    private String password;

    @ValidEmail(message="This does not appear to be a valid  address.")
    private String email;

   INCLUDES GETTER AND SETTERS
}

在我的控制器中,我正在使用此代碼

@RequestMapping("/newaccount")
    public String showNewAccount(Model model) {

        model.addAttribute("User", new User());
        return "newaccount";
    }


@RequestMapping(value="/createaccount", method=RequestMethod.POST)
    public String createAccount(@Valid User user, BindingResult result) {

        if(result.hasErrors()) {
            return "newaccount";
        }

        user.setAuthority("user");
        user.setEnabled(true);

        usersService.create(user);

        return "accountcreated";
    }
}

這是我的newaccount.jsp

<%-- <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%> --%>
<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


<html>
<head>
<link href="${pageContext.request.contextPath}/static/style.css"
    rel="stylesheet" type="text/css">

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Create Account</title>

</head>
<body>
    <sf:form action="${pageContext.request.contextPath}/createAcoount"
        method="post" commandName="User">
        <table class="formtable">
            <tr>
                <td class="label">User Name</td>
                <td><sf:input class="control" name="username" path="username"
                        type="text"></sf:input><br></br>
                <sf:errors path="username"></sf:errors></td>
            </tr>
            <tr>
                <td class="label">Email</td>
                <td><sf:input class="control" name="email" path="email"
                        type="text"></sf:input><br></br>
                <sf:errors path="email" cssClass="error"></sf:errors></td>
            </tr>
            <tr>
                <td class="label">Password</td>
                <td><sf:input class="control" name="password" path="password"
                        type="text"></sf:input><br></br>
                <sf:errors path="password" cssClass="error"></sf:errors></td>
            </tr>
            <tr>
            <td class="label"></td>
            <td><input type="submit" value="Submit"></td>
            </tr>
        </table>

    </sf:form>
</body>
</html>

當我嘗試創建一個帳戶時,我希望它根據驗證之類的錯誤消息向我顯示:用戶名不能為空。

但是,它引發了異常

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'User' available as request attribute
    org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:154)

提前致謝

您已在處理程序方法中使用鍵"user"

model.addAttribute("user", new User());

但是您的JSP中的"User"

method="post" commandName="User">

兩者應該匹配。 您還必須修改

public String createAccount(@Valid User user, BindingResult result) {

public String createAccount(@Valid @ModelAttribute("whatever you chose") User user, BindingResult result) {

因為該方法轉發到相同的視圖,但未顯式設置model屬性的名稱。 默認情況下,它將使用類型名,首字母小寫,即在這種情況下為user

看起來Spring表單在從Controller返回的屬性名稱為“ User”的模型中找不到任何內容。

您可能想要在控制器方法中將@ModelAttribute附加到User bean參數。 這樣,Spring將自動將其添加到隱式模型中(與BindingResult一起)。

確保檢查您的bean命名。 如果您將modelAttribute批注用於“ user”之類的話,我希望bean的名稱能夠在spring之前被推斷出來(注意小寫的開頭)。

您最終想要的是這樣的:

public String createAccount(
        @Valid @ModelAttribute User user, 
        BindingResult result) { 
    // ....
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM