@VALID表单验证与百里叶弹簧靴无效



当邮政请求到达控制器方法时,@valid注释不会触发验证。我该怎么办?

父控制器:

    public class ApplicationController {
    @Autowired
    private I18NService i18NService;
    public I18NService getI18NService() {
        return i18NService;
    }
    public void setI18NService(I18NService i18NService) {
        this.i18NService = i18NService;
    }
}

布局控制器:

public class ClientLayoutController extends ApplicationController{
    @Autowired
    private UserService userService;
    @Autowired
    private ClienteService clienteService;
    protected ModelAndView getModelAndView(String aActiveMenu, String aI18n, String aViewName){
        ModelAndView mav = new ModelAndView();
        User user = userService.getAuthenticatedUser();
        Cliente cliente = clienteService.getAuthenticatedCliente();
        mav.addObject("active_menu",aActiveMenu);
        mav.addObject("titulo",this.getI18NService().getMessage(aI18n));
        mav.addObject("user",user);
        mav.addObject("cliente",cliente);
        mav.setViewName(aViewName);
        return mav;
    }
// Getters ans Setters...
}

请求包含的控制器:

@Controller
public class ClienteController extends ClientLayoutController {
    @GetMapping("/client/profile")
    public ModelAndView clientProfile() {
        ModelAndView mav = this.getModelAndView("profile","client.profile","store/account-profile");
        return mav;
    }
    @PostMapping("/client/profile")
    public ModelAndView clientProfileUpdate(@Valid Cliente cliente,BindingResult bindingResult,Model model) {
        System.out.println("sdfsdf "+cliente.getNome());
        System.out.println(bindingResult.getErrorCount());
        if(bindingResult.hasErrors()){
            ModelAndView mav = this.getModelAndView("profile","client.profile","store/account-profile");
            mav.addObject("cliente",cliente);
            return mav;
        }
        return this.getModelAndView("profile","client.profile","store/account-profile");
    }
}

胸腺形式:

<form th:method="post" th:action="@{'/client/profile'}" th:object="${cliente}">
    <div class="form-group">
        <label for="nomecli" th:text="#{client.profile.name}">First Name</label>
        <input th:field="*{nome}" type="text" id="nomecli" class="form-control" th:placeholder="#{client.profile.name}"/>
        <span th:if="${#fields.hasErrors('nome')}" th:errors="*{nome}" class="text-danger"></span>
    </div>            
    <button type="submit" class="btn btn-default btn-theme" th:inline="text"><i class="fa fa-check"></i> [[#{crud.save}]]</button>
</form>

实体:

@Entity(name = "cliente")
public class Cliente {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(name = "nome")
    @NotEmpty(message = "Informe o nome")
    private String nome;
// Other fields...
}

bindingResult.getErrorCount((即使我发布了空白,也总是0。我尝试在Google上添加@notnull和许多其他内容,但没有成功。

删除了我在应用程序上拥有的所有自定义验证器,并删除了我在其他控制器上使用的所有@InitBinders来自定义验证它们。现在@Valid具有预期的行为。在我自己发现这一点之后,下面的帖子解释了更好。

春季 - 混合注释和基于验证器的验证

在控制器的签名中添加@ModelAttribute("cliente")如下:

public ModelAndView clientProfileUpdate(@Valid @ModelAttribute("cliente") Cliente cliente, BindingResult bindingResult,Model model) {...}

另一方面,您将Entity传递给视图,该视图用于表示数据库条目。使用数据传输对象,这只是一个简单的POJO类,然后将@NotNull@NotEmpty注释添加到其字段中。

最新更新