当前位置: 首页 > 知识库问答 >
问题:

@有效表单验证不适用于Thymeleaf Spring Boot

曹景铄
2023-03-14

当post请求到达控制器方法时,@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...
}

结果如何。getErrorCount()始终为0,即使我发布了一个空白表单。我曾尝试在谷歌上添加@NotNull和其他很多东西,但没有成功。

共有2个答案

尹何平
2023-03-14

添加@ModelAt0016("cliente")到控制器的签名,如下所示:

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

另一方面,您正在向视图传递一个用于表示数据库条目的Entity。使用一个数据搬迁对象,它只是一个简单的POJO类,并将@NotNull@Not空注释添加到它的字段中。

秦昊穹
2023-03-14

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

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

 类似资料:
  • 我正在寻找表单验证的最有效方法,我想知道我目前的植入是否不仅是可能的,而且在动态缩放时是可持续的。看看吧: (警告:忽略愚蠢的HTML类名) 是否有一种方法可以在输入中将forEach空白字段添加到数组中的错误字符串?现在,它只在数组中抛出一个字符串,作为它命中的第一个空白字段。

  • 我正在使用spring(4.2.0.RELEASE)、hibernate validator(5.2.1.Final)和validation api(1.1.0.Final)对后端应用程序进行JSR验证,配置如下:, 但是没有一个JSR303注释在我的应用程序中工作。 注意:在POJO类上添加了JSR303注释,在服务类(使用POJO)上添加了@Validated注释,还尝试在方法级别添加@Val

  • 我正在尝试使用Hibernate Validator 5.0.1和JSF2.2,但自mojarra版本2.2.3以来,它们的集成似乎被破坏了。我创建了一个小应用程序来演示这个问题,并获得异常“javax.servlet.ServletException:表达式错误:命名对象:未找到javax.faces.Bean”在Tomcat 7.0.42上运行时。 还有其他人有这个问题吗? webapp/页面

  • 我正在尝试在我的Jenkins工具中配置LDAP身份验证。我已经在Jenkins上完成了以下LDAP身份验证的设置,但我仍然无法登录。 服务器:ldaps://rootdc1.myweb.com:636 根DN:dc=myweb,dc=com 提前感谢!

  • 我试图通过将请求参数直接绑定到用户实体来简化我的代码,而不是一个字段一个字段地复制值,但是我似乎不能通过这种方式得到验证。 控制器: 验证器: 模型(注意嵌套对象用@Valid标注): 问题是只有密码和重新密码字段被正确验证,用户类中的验证注释被忽略,任何密码匹配的请求都通过,但它应该会出现错误。空密码或不同的密码会按预期出现错误。

  • 我使用Python和selenium(PhantomJS webdriver)来解析网站,但遇到了问题。 我想从这个电台网站获取当前歌曲:http://www.eskago.pl/radio/eska-warszawa. xpath: 该xpath不适用于python selenium 错误: Traceback(最近一次调用):File"parser4.py",第41行,p.loop()File