- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在尝试使用 Spring Boot 和 Thymeleaf 验证表单时遇到问题。只需使用给定字段注册用户即可。我使用的是多部分表单,因为该表单还上传图片,但我已经尝试在没有它的情况下使用该表单,但仍然存在同样的问题。
顺便说一句,我知道这个问题有很多,但没有一个答案对我有帮助......
如果表单字段正确,则一切正常。但如果我输入无效字段,我会得到响应:
HTTP Status 400 -
type Status report
message
description The request sent by the client was syntactically incorrect.
我只是想显示一个气泡来警告该字段。目前我在 html 输入标记中使用“pattern”,但用户可以将其从浏览器中删除。我可以使 Controller 中的进程检查无效并重定向到相同的已清理页面,但这只是一个令人不舒服的解决方法。
<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>
这是 Controller :
@RequestMapping(value="new_user", method = RequestMethod.GET)
public String addUserPage(Model model) {
model.addAttribute("user", new User());
return "site/user/add_user";
}
@RequestMapping(value = "new_user", method = RequestMethod.POST)
public String processAddUserWeb(@Valid @ModelAttribute(value = "user") User user,
@ModelAttribute(value = "profilePic") MultipartFile profilePic,
BindingResult result) throws LoginNotAvailableException {
if (result.hasErrors()) {
System.out.println("Form has errors");
return "elovendo/user/add_user";
}
else {
System.out.println("Form is ok");
byte[] profilePicBytes = null;
if (!profilePic.isEmpty()) try {
profilePicBytes = profilePic.getBytes();
} catch (IOException e) {
System.out.println("Error converting to bytes image file");
}
userService.addUser(user, profilePicBytes);
return "site/user/registered_successful";
}
}
用户类是:
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, ...
}
我还尝试使用 Validator 的实现:
public class FormValidator implements Validator {
private Pattern pattern;
private Matcher matcher;
@Override
public boolean supports(Class<?> clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User) target;
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "login", "required.login");
// input string conatains numeric values only
if (user != null) {
pattern = Pattern.compile(Constant.loginPattern);
matcher = pattern.matcher(user.getLogin());
if (!matcher.matches()) {
errors.rejectValue("login", "login.invalid");
}
}
}
}
并在 Controller 中使用它(首先没有@Valid注释,但无论有或没有它都会执行相同的[相同的错误]):
@RequestMapping(value = "new_user", method = RequestMethod.POST)
public String processAddUserWeb(@ModelAttribute(value = "user") User user,
@ModelAttribute(value = "profilePic") MultipartFile profilePic,
BindingResult result) throws LoginNotAvailableException {
FormValidator formValidator = new FormValidator();
formValidator.validate(user, result);
if (result.hasErrors()) {
System.out.println("Form has errors");
return "elovendo/user/add_user";
}
}
但也没有工作。如果不使用 th:if="${#fields.hasErrors('user.login')}(...) 标签(这很愚蠢,但我只是拼命地寻找一个解决方案)返回:
org.springframework.beans.NotReadablePropertyException: Invalid property 'login' of bean class [java.lang.String]: Bean property 'login' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter? (...).validator.FormValidator.validate(FormValidator.java:28)
在这里询问,这是处理此问题时失去所有头发之前的最后一站,希望有人可以帮助我。谢谢!
编辑
这是我发送包含无效数据的表单帖子时的日志:
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
最佳答案
您需要将 BindingResult
放在 User user
之后,以便 Spring 能够正确处理无效数据。
Controller 方法将如下所示:
public String processAddUserWeb(@ModelAttribute(value = "user") User user,
BindingResult result,
@ModelAttribute(value = "profilePic") MultipartFile profilePic)
关于spring - 验证表单时出现错误 400 "The request sent was syntactically incorrect",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25125981/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!