Spring 错误400验证表单“;发送的请求在语法上不正确”;

Spring 错误400验证表单“;发送的请求在语法上不正确”;,spring,validation,spring-mvc,spring-boot,thymeleaf,Spring,Validation,Spring Mvc,Spring Boot,Thymeleaf,我在尝试使用Spring Boot和Thymeleaf验证表单时遇到问题。from仅使用给定字段注册用户。我使用的是一个多部分表单,因为表单也会上传一张图片,但我已经尝试过在没有它的情况下使用表单,但仍然存在同样的问题 顺便说一句,我知道这个问题有很多,但没有一个答案能帮助我 如果表单字段正确,则一切正常。但如果我输入了一个无效字段,我会得到一个响应: HTTP状态400- 类型状态报告 信息 说明客户端发送的请求在语法上不正确 我只是想展示一个气泡来警告这个领域。目前,我在html输入标记中使

我在尝试使用Spring Boot和Thymeleaf验证表单时遇到问题。from仅使用给定字段注册用户。我使用的是一个多部分表单,因为表单也会上传一张图片,但我已经尝试过在没有它的情况下使用表单,但仍然存在同样的问题

顺便说一句,我知道这个问题有很多,但没有一个答案能帮助我

如果表单字段正确,则一切正常。但如果我输入了一个无效字段,我会得到一个响应:

HTTP状态400-

类型状态报告

信息

说明客户端发送的请求在语法上不正确

我只是想展示一个气泡来警告这个领域。目前,我在html输入标记中使用“模式”,但用户只需将其从浏览器中删除即可。我可以在控制器中使进程检查无效,并重定向到同一个已清理的页面,但这只是一种不舒服的解决方法

<form class="styleweb" id="registrationform" th:action="@{/site/new_user}" method="post" enctype="multipart/form-data">
        <fieldset>

            <div class="styleweb">
                <label for="login">Login</label> <input id="login" type="text"
                    placeholder="Username" th:field="${user.login}" />
                    <p th:if="${#fields.hasErrors('user.login')}" th:errors="*{user.login}">Incorrect stuff</p>
            </div>

            <div class="styleweb">
                <label for="password">Password</label>
                    <input id="password"
                    type="password" placeholder="Password" th:field="${user.password}"/>
            </div>

            <div class="pure-control-group">
                <label for="email">Email Address</label> <input id="email"
                    type="email" placeholder="Email Address" th:field="${user.email}"/>
            </div>

            <div class="pure-control-group">
                <label for="foo">Profile pic</label> <input type="file" name="profilePic" id="imgInp"/>
                <img id="profilepic" src="#" alt="avatar" />
            </div>

            <div class="styleweb">
                <button type="submit" class="styleweb">Submit</button>
            </div>
        </fieldset>
    </form>
用户类为:

public class User implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "userId")
    private Long userId;

    @NotNull(message="Login cannot be null")
    @Length(min = 2, max = 20, message="Invalid login lenght")
    @Pattern(regexp=Constant.loginPattern, message="Invalid login name")
    private String login;

    @Column(name = "password", length = 255)
    @Length(min = 8, max = 255)
    private String password;

    private String email;

    // constructor, getters and setters, ...

}
我还尝试使用以下实现:

但也不管用。如果不使用th:If=“${#fields.hasErrors('user.login')}(…)标记(这是一个哑标记,但我只是拼命想找到一个解决方案)返回:

org.springframework.beans.NotReadablePropertyException:无效 bean类的属性“login”[java.lang.String]:bean属性 “login”不可读或具有无效的getter方法:是否 getter的返回类型是否与setter的参数类型匹配? (…).validator.FormValidator.validate(FormValidator.java:28)

问一下,这是我处理这件事的最后一站,希望有人能帮助我。 谢谢大家!

编辑

以下是我发送包含无效数据的表单post时的日志:

2014-08-06 14:42:01.717 DEBUG 9759 --- s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /site/new_user
2014-08-06 14:42:01.718 DEBUG 9759 --- s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public java.lang.String es.sdfd.rest.web.UserWebController.processAddUserWeb(es.sfacut.model.user.User,java.lang.String,org.springframework.web.multipart.MultipartFile,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) throws es.sfacut.rest.controller.exception.LoginNotAvailableException,java.io.UnsupportedEncodingException]
2014-08-06 14:42:01.743 DEBUG 9759 --- .m.m.a.ExceptionHandlerExceptionResolver : Resolving exception from handler [public java.lang.String es.sfacut.rest.web.UserWebController.processAddUserWeb(es.sfacut.model.user.User,java.lang.String,org.springframework.web.multipart.MultipartFile,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) throws es.sfacut.rest.controller.exception.LoginNotAvailableException,java.io.UnsupportedEncodingException]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'user' on field 'login': rejected value [u]; codes [Pattern.user.login,Pattern.login,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],[Ljavax.validation.constraints.Pattern$Flag;@23d2602c,^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$]; default message [Invalid login name]
Field error in object 'user' on field 'login': rejected value [u]; codes [Length.user.login,Length.login,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],20,2]; default message [Invalid login lenght]
2014-08-06 14:42:01.744 DEBUG 9759 --- .w.s.m.a.ResponseStatusExceptionResolver : Resolving exception from handler [public java.lang.String es.sfacut.rest.web.UserWebController.processAddUserWeb(es.sfacut.model.user.User,java.lang.String,org.springframework.web.multipart.MultipartFile,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) throws es.sfacut.rest.controller.exception.LoginNotAvailableException,java.io.UnsupportedEncodingException]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'user' on field 'login': rejected value [u]; codes [Pattern.user.login,Pattern.login,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],[Ljavax.validation.constraints.Pattern$Flag;@23d2602c,^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$]; default message [Invalid login name]
Field error in object 'user' on field 'login': rejected value [u]; codes [Length.user.login,Length.login,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],20,2]; default message [Invalid login lenght]
2014-08-06 14:42:01.745 DEBUG 9759 --- .w.s.m.s.DefaultHandlerExceptionResolver : Resolving exception from handler [public java.lang.String es.sfacut.rest.web.UserWebController.processAddUserWeb(es.sfacut.model.user.User,java.lang.String,org.springframework.web.multipart.MultipartFile,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) throws es.sfacut.rest.controller.exception.LoginNotAvailableException,java.io.UnsupportedEncodingException]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'user' on field 'login': rejected value [u]; codes [Pattern.user.login,Pattern.login,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],[Ljavax.validation.constraints.Pattern$Flag;@23d2602c,^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$]; default message [Invalid login name]
Field error in object 'user' on field 'login': rejected value [u]; codes [Length.user.login,Length.login,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],20,2]; default message [Invalid login lenght]
2014-08-06 14:42:01.745 DEBUG 9759 --- o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2014-08-06 14:42:01.746 DEBUG 9759 --- o.s.web.servlet.DispatcherServlet        : Successfully completed request
2014-08-06 14:42:01.748 DEBUG 9759 --- o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing POST request for [/error]
2014-08-06 14:42:01.749 DEBUG 9759 --- s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /error
2014-08-06 14:42:01.749 DEBUG 9759 --- s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public java.lang.String es.sfacut.rest.controller.MainController.errorPage()]
2014-08-06 14:42:01.751 DEBUG 9759 --- o.s.web.servlet.DispatcherServlet        : Rendering view [org.thymeleaf.spring4.view.ThymeleafView@503dc0cf] in DispatcherServlet with name 'dispatcherServlet'
2014-08-06 14:42:01.755 DEBUG 9759 --- o.s.web.servlet.DispatcherServlet        : Successfully completed request
2014-08-06 14:54:25.703 DEBUG 10138 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/site/new_user]
2014-08-06 14:54:25.703 DEBUG 10138 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /site/new_user
2014-08-06 14:54:25.705 DEBUG 10138 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public java.lang.String es.sfacut.rest.web.UserWebController.addUserPage(org.springframework.ui.Model)]
2014-08-06 14:54:25.705 DEBUG 10138 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/site/new_user] is: -1
2014-08-06 14:54:25.712 DEBUG 10138 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Rendering view [org.thymeleaf.spring4.view.ThymeleafView@4b34f94d] in DispatcherServlet with name 'dispatcherServlet'
2014-08-06 14:54:25.722 DEBUG 10138 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Successfully completed request
这是包含有效数据的日志:

2014-08-06 14:42:01.717 DEBUG 9759 --- s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /site/new_user
2014-08-06 14:42:01.718 DEBUG 9759 --- s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public java.lang.String es.sdfd.rest.web.UserWebController.processAddUserWeb(es.sfacut.model.user.User,java.lang.String,org.springframework.web.multipart.MultipartFile,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) throws es.sfacut.rest.controller.exception.LoginNotAvailableException,java.io.UnsupportedEncodingException]
2014-08-06 14:42:01.743 DEBUG 9759 --- .m.m.a.ExceptionHandlerExceptionResolver : Resolving exception from handler [public java.lang.String es.sfacut.rest.web.UserWebController.processAddUserWeb(es.sfacut.model.user.User,java.lang.String,org.springframework.web.multipart.MultipartFile,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) throws es.sfacut.rest.controller.exception.LoginNotAvailableException,java.io.UnsupportedEncodingException]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'user' on field 'login': rejected value [u]; codes [Pattern.user.login,Pattern.login,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],[Ljavax.validation.constraints.Pattern$Flag;@23d2602c,^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$]; default message [Invalid login name]
Field error in object 'user' on field 'login': rejected value [u]; codes [Length.user.login,Length.login,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],20,2]; default message [Invalid login lenght]
2014-08-06 14:42:01.744 DEBUG 9759 --- .w.s.m.a.ResponseStatusExceptionResolver : Resolving exception from handler [public java.lang.String es.sfacut.rest.web.UserWebController.processAddUserWeb(es.sfacut.model.user.User,java.lang.String,org.springframework.web.multipart.MultipartFile,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) throws es.sfacut.rest.controller.exception.LoginNotAvailableException,java.io.UnsupportedEncodingException]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'user' on field 'login': rejected value [u]; codes [Pattern.user.login,Pattern.login,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],[Ljavax.validation.constraints.Pattern$Flag;@23d2602c,^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$]; default message [Invalid login name]
Field error in object 'user' on field 'login': rejected value [u]; codes [Length.user.login,Length.login,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],20,2]; default message [Invalid login lenght]
2014-08-06 14:42:01.745 DEBUG 9759 --- .w.s.m.s.DefaultHandlerExceptionResolver : Resolving exception from handler [public java.lang.String es.sfacut.rest.web.UserWebController.processAddUserWeb(es.sfacut.model.user.User,java.lang.String,org.springframework.web.multipart.MultipartFile,org.springframework.validation.BindingResult,org.springframework.ui.ModelMap) throws es.sfacut.rest.controller.exception.LoginNotAvailableException,java.io.UnsupportedEncodingException]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'user' on field 'login': rejected value [u]; codes [Pattern.user.login,Pattern.login,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],[Ljavax.validation.constraints.Pattern$Flag;@23d2602c,^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$]; default message [Invalid login name]
Field error in object 'user' on field 'login': rejected value [u]; codes [Length.user.login,Length.login,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],20,2]; default message [Invalid login lenght]
2014-08-06 14:42:01.745 DEBUG 9759 --- o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2014-08-06 14:42:01.746 DEBUG 9759 --- o.s.web.servlet.DispatcherServlet        : Successfully completed request
2014-08-06 14:42:01.748 DEBUG 9759 --- o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing POST request for [/error]
2014-08-06 14:42:01.749 DEBUG 9759 --- s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /error
2014-08-06 14:42:01.749 DEBUG 9759 --- s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public java.lang.String es.sfacut.rest.controller.MainController.errorPage()]
2014-08-06 14:42:01.751 DEBUG 9759 --- o.s.web.servlet.DispatcherServlet        : Rendering view [org.thymeleaf.spring4.view.ThymeleafView@503dc0cf] in DispatcherServlet with name 'dispatcherServlet'
2014-08-06 14:42:01.755 DEBUG 9759 --- o.s.web.servlet.DispatcherServlet        : Successfully completed request
2014-08-06 14:54:25.703 DEBUG 10138 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/site/new_user]
2014-08-06 14:54:25.703 DEBUG 10138 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /site/new_user
2014-08-06 14:54:25.705 DEBUG 10138 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public java.lang.String es.sfacut.rest.web.UserWebController.addUserPage(org.springframework.ui.Model)]
2014-08-06 14:54:25.705 DEBUG 10138 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/site/new_user] is: -1
2014-08-06 14:54:25.712 DEBUG 10138 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Rendering view [org.thymeleaf.spring4.view.ThymeleafView@4b34f94d] in DispatcherServlet with name 'dispatcherServlet'
2014-08-06 14:54:25.722 DEBUG 10138 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Successfully completed request
大多数
元素

<input id="login" type="text" placeholder="Username" th:field="${user.login}" />
<input id="password" type="password" placeholder="Password" th:field="${user.password}"/>
<input id="email" type="email" placeholder="Email Address" th:field="${user.email}"/>

没有
名称
属性。
名称
属性是
元素作为提交的
的一部分发送所必需的。因此这些属性不会被发送,验证似乎失败


元素中添加一个
name
属性,该属性的值可能与
id
相同。

您需要将
BindingResult
放在
用户
之后,Spring才能正确处理无效数据

因此,控制器方法如下所示:

public String processAddUserWeb(@ModelAttribute(value = "user") User user,
                                BindingResult result,
                                @ModelAttribute(value = "profilePic") MultipartFile profilePic)

BindingResult和@ModelAttribute的顺序无效 我只是改变了顺序,像个魔术师一样工作

@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String addUser( @ModelAttribute("SpringWeb")@Valid User user,BindingResult binding, ModelMap model) {
    System.out.println(binding.toString());

    if (!binding.hasErrors()) {

        System.out.println("Has No Error");
        model.addAttribute("username", user.getUsername());
        model.addAttribute("password", user.getPassword());
        model.addAttribute("address", user.getAddress());
        model.addAttribute("receivePaper", user.isReceivePaper());
        model.addAttribute("favoriteFrameworks", user.getFavoriteFrameworks());
        model.addAttribute("gender", user.getGender());
        model.addAttribute("favoriteNumber", user.getFavoriteNumber());
        model.addAttribute("country", user.getCountry());

        return "users";

    } else {
        System.out.println("Has  Error");

        return "error";
    }

}

感谢您的回复,但添加name属性没有任何区别。我尝试了几件添加了该属性的事情,但似乎都不起作用。@frostering您发送的是有效数据吗?将日志转到调试级别,并向我们准确显示错误请求和良好请求的打印内容。当我发送有效数据和所有内容时工作正常。但如果数据无效则不行。我已经使用HTML5模式属性进行了一次解决,如果HTML5表单已被编辑,则会抛出一个错误页面(因此我不允许无效值),但我想知道这是怎么回事,为什么不起作用。我猜返回给名为“DispatcherServlet”的DispatcherServlet的Null ModelAndView:假设HandlerAdapter完成的请求处理与此有关?您是否尝试过将
BindingResult
放在
用户
之后(您现在在
多部分文件配置文件pic
之后有了它)?@geo好的,现在我得到的是预期的页面,而不是错误页面,但我在表单字段中根本看不到任何错误消息。无论是否使用我的验证器的实现。尝试在
@modeldattribute
前面添加
@Valid
,并告诉我发生了什么对不起@geo,您的第一个响应是正确的!这是我的错,因为我在注释了Nevermind之后,我发现了它:错误或BindingResult参数必须跟在立即绑定的模型对象后面,因为方法签名可能有多个模型对象,Spring将为每个模型对象创建一个单独的BindingResult实例,所以下面的示例在16.3.3中不起作用
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String addUser( @ModelAttribute("SpringWeb")@Valid User user,BindingResult binding, ModelMap model) {
    System.out.println(binding.toString());

    if (!binding.hasErrors()) {

        System.out.println("Has No Error");
        model.addAttribute("username", user.getUsername());
        model.addAttribute("password", user.getPassword());
        model.addAttribute("address", user.getAddress());
        model.addAttribute("receivePaper", user.isReceivePaper());
        model.addAttribute("favoriteFrameworks", user.getFavoriteFrameworks());
        model.addAttribute("gender", user.getGender());
        model.addAttribute("favoriteNumber", user.getFavoriteNumber());
        model.addAttribute("country", user.getCountry());

        return "users";

    } else {
        System.out.println("Has  Error");

        return "error";
    }

}