【问题标题】:org.springframework.validation.BeanPropertyBindingResultorg.springframework.validation.BeanPropertyBindingResult
【发布时间】:2013-12-27 12:27:48
【问题描述】:

控制器类-

@Controller
@SessionAttributes({"id", "roleId"})
@RequestMapping("/User")
public class UserController {

@Autowired
private UserService userv = null;           

@InitBinder("stdUser")
private void initBinder(WebDataBinder binder) {
    System.out.println("1111======"+binder.getObjectName());
    binder.setValidator(new NewUserValidator());
    System.out.println("2222======"+binder.getObjectName());
}

@RequestMapping(value = "/allUsers")
public ModelAndView allUser(@ModelAttribute("userSetup")@Valid UserBean stdUser, BindingResult result, Map<String, Object> map, HttpSession session) {
    StdCheckAccessV chk = new StdCheckAccessV();
    chk.setFexe(Screens.User.substring(Screens.User.lastIndexOf("/") + 1, Screens.User.length()));
    chk.setUid(Long.parseLong(session.getAttribute("id").toString().trim()));
    chk.setRid(Long.parseLong(session.getAttribute("roleId").toString().trim()));
    chk = userv.getAccess(chk);
    List<StdUsers> l = userv.getUsersList();
    stdUser.setChkAccessV(chk);
    map.put("userList", l);
    return new ModelAndView(Screens.User);
}
@RequestMapping(value = "/submitUser")
public ModelAndView addOrUpdate(@ModelAttribute("userSetup")@Valid UserBean stdUser, BindingResult result, HttpSession session, final RedirectAttributes redA) {
    try {
        int res = 0;
        Long id = stdUser.getStdUsers().getId();
        if (result.hasErrors()) {
            System.out.println("///////result has errors   " + result.toString());
            return new ModelAndView("redirect:/User/allUsers");
        }
        System.out.println("////////the id============"+id);
        if (id == null) {
            System.out.println("/////inside the if");
            stdUser.getStdUsers().setUserGroupId(Long.parseLong(session.getAttribute("id").toString().trim()));
            stdUser.getStdUsers().setCreatedBy(Long.parseLong(session.getAttribute("id").toString().trim()));
            stdUser.getStdUsers().setCreationDate(new Date());
            res = userv.submitUser(stdUser);
        } else {
            System.out.println("/////inside the else");
            stdUser.getStdUsers().setUpdateDate(new Date());
            stdUser.getStdUsers().setUpdatedBy(Long.parseLong(session.getAttribute("id").toString().trim()));
            res = userv.updateUser(stdUser);
        }
    } catch (Exception e) {
        System.out.println("////Exception in add or update method " + e);
    }
    return new ModelAndView("redirect:/User/allUsers");
    //return "redirect:/User/allUsers";
}}

验证器类-

@Component
public class NewUserValidator implements Validator {

@Override
public boolean supports(Class<?> userOb) {
    return UserBean.class.equals(userOb);
}

@Override
public void validate(Object target, Errors errors) {
    try {
        UserBean user = (UserBean) target;
        if (user.getStdUsers().getUserName() == null) {
            ValidationUtils.rejectIfEmptyOrWhitespace(errors, "stdUsers.userName", "user.name.empty");
            //errors.reject("stdUsers.userName", "User Name is mandatory");
        }
    } catch (Exception e) {
        System.out.println(e);
    }
}

} 豆类-

public class UserBean {

private @Valid StdUsers stdUsers;
private @Valid StdCheckAccessV chkAccessV;
private boolean listView = true;
private String rePassword;

getters and setters.... }

index.jsp-

<body>
    <%
        session.setAttribute("id", 1);
        session.setAttribute("roleId", 1);
    %>
    <a href="User/allUsers.html">User</a><br>
</body>

CMN/STD100002.jsp 页面

<td class="tdright"><form:label path="stdUsers.userName">User Name<em>*</em></form:label></td>
                    <td><form:input path="stdUsers.userName"/></td>
                    <td><form:errors path="stdUsers.userName"></form:errors></td>
<a href="#" name="btnsub" id="btnsub" onclick="submitUser()">
                                <table cellspacing="0" cellpadding="0" border="0">
                                    <tr>
                                        <td width="25" height="24px" align="center">
                                            <img src="${pageContext.servletContext.contextPath}/resources/images/Buttons/gray icon/Add.png" width="16" height="15"  border="0" />
                                        </td>
                                        <td>Submit</td>
                                        <td></td>
                                    </tr>
                                </table>
                            </a>
        <script type="text/javascript">

        function submitUser(){
            document.form1.action="${pageContext.servletContext.contextPath}/User/submitUser";
            document.form1.submit();
        }

    </script>

我正在学习在 spring 中使用验证的教程,因为我是 spring 新手。 在 User Name 字段为空的情况下单击提交按钮时,应该使用来自 Validator 的消息对其进行验证。 当我尝试在控制器类中打印错误时-

System.out.println("result has errors   " + result.toString());

它打印-

result has errors   org.springframework.validation.BeanPropertyBindingResult: 1 errors

请帮忙,我没有找到我错的地方。

我用这段代码检查错误在哪里-

for (Object object : result.getAllErrors()) {
            if (object instanceof FieldError) {
                FieldError fieldError = (FieldError) object;
                System.out.println("the field errors::::::::::::::::"+fieldError.getCode());
            }
            if (object instanceof ObjectError) {
                ObjectError objectError = (ObjectError) object;
                System.out.println("the object errors:::::::::"+objectError.getCode());
            }
        }

我发现-

the field errors::::::::::::::::user.name.empty
the object errors:::::::::user.name.empty
///////result has errors   org.springframework.validation.BeanPropertyBindingResult: 2       errors

Field error in object 'userSetup' on field 'stdUsers.userName': rejected value []; codes  [user.name.empty.userSetup.stdUsers.userName,user.name.empty.stdUsers.userName,user.name.em pty.userName,user.name.empty.java.lang.String,user.name.empty]; arguments []; default  message [null]

由于这两个字段我将空置以检查验证。如果我在将字段置空时会收到这些错误,那么我该如何验证它们?

StdUser-

@Entity
@Table(name = "STD_USERS")
@NamedQueries({
@NamedQuery(name = "StdUsers.findAll", query = "SELECT s FROM StdUsers s")})
public class StdUsers implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GenericGenerator(name="generator",strategy="increment")
@GeneratedValue(generator="generator")
@Basic(optional = false)
@Column(name = "ID", nullable = false)
private Long id;
@Basic(optional = false)
@Column(name = "USER_NAME", nullable = false, length = 50)
private String userName;

setters and getters.....

任何人请回复。

【问题讨论】:

  • 我看不出问题出在哪里...
  • 为什么不打印绑定结果错误,而不是显示有多少?
  • @SotiriosDelimanolis 请检查编辑部分。

标签: spring spring-mvc jstl


【解决方案1】:

哦,终于在这里找到了解决方案- 将 Validator 类更改为-

try {
        UserBean user = (UserBean) target;

            ValidationUtils.rejectIfEmptyOrWhitespace(errors, "stdUsers.userName","required.stdUsers.userName" ,"User name required");

    } catch (Exception e) {
        System.out.println(e);
    }

并且在控制器类中而不是在 result.hasError() 时返回控制器的 allUsers 方法,即-

return new ModelAndView("redirect:/User/allUsers");

更改为(导航到页面)-

return new ModelAndView("/CMN/STD100002");

是的,如果您遇到与日期转换相关的错误,请在您的控制器类中使用它-

@InitBinder
private void initBinder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");//edit for the    format you need
    dateFormat.setLenient(false);
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 2020-09-11
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多