Hibernate @Valid在SpringMVC中的奇怪行为

时间:2015-10-06 15:16:58

标签: java hibernate validation spring-mvc uri

首先,我对此非常陌生,如果这个问题愚蠢,对不起。我有两个带有类请求映射的控制器和用于验证的表单:

@Controller
@RequestMapping("/creditcard")
public class CreditCardController {
    @Autowired
    //repositories

    @RequestMapping(value = "/addnewcard", method = RequestMethod.POST)
    public String addNew(
             @ModelAttribute("newCard") @Valid CreditCard creditCard,
            BindingResult bindingResult, Principal principal, Model model) {
        if (bindingResult.hasErrors()) {
            //render error view
        }
        creditCardService.registerNew(creditCard, principal.getName());
        return "redirect:/account";
    }

另一个

@Controller
@RequestMapping("/account")
public class AccountController {
    @Autowired
    //repo

    @RequestMapping("")
    public String showUserProfile(Principal principal, Model model) {
        String username = principal.getName();
        User user = userService.findByUsername(username);
        Account account = user.getAccount();
        List<Payment> payers = paymentService
                .getAllPaymentsForPayerAccount(account.getId());
        model.addAttribute("user", user);
        model.addAttribute("account", account);
        model.addAttribute("payers", payers);
        return "userprofile";
    }
}

userprofile.jsp上的表格

<form:form cssClass="form-horizontal" modelAttribute="newCard" action="creditcard/addnewcard">
........
</form:form>

所有这一切都没有@Valid。当我添加@Valid时,它可以正常工作,当验证失败时(显示带有消息的错误视图),但是当它成功时,由于URI不正确而导致404错误 - http://localhost:8080/PaymentSystem/creditcard/creditcard/addnewcard。这里有一个/creditcard是额外的,@Valid以某种方式将此添加到我的URI中。我找到了解决这个问题的方法: 1)我将addNew卡片方法移至&#39; AccountController&#39;

2)我刚刚删除@RequestMapping("/creditcard")

但我仍然没有找到任何有关此类行为的解释。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的第三种方法,最适合这种情况。我刚刚将${pageContext.request.contextPath}添加到我的行动参数中:

<form:form cssClass="form-horizontal" modelAttribute="newCard" action="${pageContext.request.contextPath}/creditcard/addnewcard">
........
</form:form>

但它仍然不知道这种@Valid行为的原因。