我已经实现了我的自定义类的列表,在此提到的验证岗位.这里参考我的代码看起来像
class TopDtoForm {
@NotEmpty
private String topVar;
private List<DownDto> downVarList;
//getter and setter
}
class DownDto {
private Long id;
private String name;
//getter and setter
}
@Component
public class TopDtoFormValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return TopDtoForm.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
TopDtoForm topDtoForm = (TopDtoForm) target;
for(int index=0; index<topDtoForm.getDownVarList().size(); index++) {
DownDto downDto = topDtoForm.getDownVarList().get(index);
if(downDto.getName().isEmpty()) {
errors.rejectValue("downVarList[" + index + "].name", "name.empty");
}
}
}
} …Run Code Online (Sandbox Code Playgroud) 目前,我有类似
@NotNull(message="{err.required}")
@Size(min=1, message="{err.required}")
private String firstName;
Run Code Online (Sandbox Code Playgroud)
在我的messages.properties,我有
err.required={0} is required.
Run Code Online (Sandbox Code Playgroud)
它可以工作,但可以打印出firstName is required.难看的东西。它在中传递了变量名称firstName作为参数{0}。
我该如何传递“ First name ”之类的信息?所以它将成为First name is required.
我是Spring MVC的新手,我已经导入了一个与服务器端验证相关的教程项目,我对它究竟是如何工作有一些疑问.
所以我有一个名为login.jsp的登录页面,其中包含以下登录表单:
<form:form action="${pageContext.request.contextPath}/login" commandName="user" method="post">
<table>
<tr>
<td><label>Enter Username : </label></td>
<td><form:input type="text" path="username" name="username" />
<br> <form:errors path="username" style="color:red;"></form:errors>
</td>
</tr>
<tr>
<td><label>Enter Password : </label></td>
<td><form:input type="password" path="password" name="password" />
<br> <form:errors path="password" style="color:red;"></form:errors>
</td>
</tr>
<tr>
<td> </td>
<td align="center"><input type="submit" value="Login" /></td>
</tr>
</table>
</form:form>
Run Code Online (Sandbox Code Playgroud)
我认为使用从模型中检索到的commandName ="user"属性指定的对象(如果我做了错误的断言,请核对我)来存储用户插入的用户名和密码.
此commandName ="user"是此User类的实例:
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotBlank;
public class User {
@NotBlank(message="Username can not be blank")
private String username;
@Size(min=6,message="Password must …Run Code Online (Sandbox Code Playgroud) 如果我们定义一个类级别的验证批注,例如一个比较字段并具有ConstraintValidator如下内容的批注:
public class ComparisonValidator implements ConstraintValidator<ValueMatches, Object>
{
private String[] fields;
@Override
public void initialize(final ValueMatches constraintAnnotation) {
fields = constraintAnnotation.fields();
}
@Override
public boolean isValid(final Object value, final ConstraintValidatorContext context) {
if (fields.length == 0) {
return true;
}
final BeanWrapperImpl beanWrapper = new BeanWrapperImpl(value);
final Object comparisonValue = beanWrapper.getPropertyValue(fields[0]);
for (int i = 1; i < fields.length; i++) {
final Object fieldValue = beanWrapper.getPropertyValue(fields[i]);
if (!comparisonValue.equals(fieldValue)) {
return false;
}
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我们很好地产生了一个全局验证错误,可以通过Thymeleaf使用以下命令进行访问: …
我一直在阅读关于类验证测试的Hibernate文档,我没有找到任何解决我的"问题"的方法.我想测试我的自定义验证器.例如,假设我有以下类:
public class User {
@NotEmpty(message = "{username.notSpecified}")
private String username;
@NotEmpty
@Size(min = 6, message = "{password.tooShort")
private String password;
@NotEmpty(message = "{city.notSpecified}")
private String city;
/* getters & setters omitted */
}
Run Code Online (Sandbox Code Playgroud)
我想检查每个用户是否位于巴塞罗那市.为此,我将自定义用户验证器实现如下:
public class UserValidator implements Validator {
@Autowired
private Validator validator;
@Override
public boolean supports(Class<?> clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
validator.validate(target,errors);
User user = (User) target;
if(!(user.getCity().equals("Barcelona"))){
errors.rejectValue("city", "city.notValid", "Invalid city");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何使用这个自定义验证器而不是示例中提供的默认验证器,并且只检查带注释的字段约束而不是更多的"业务逻辑"约束.关于那个的任何例子或线索?
谢谢!
我已经检查了类似的问题,但我没有任何匹配.
我检查一下我是否有错误:
result.getErrorCount() != 0)
Run Code Online (Sandbox Code Playgroud)
在里面我有使用的错误列表
List<ObjectError> ae = result.getAllErrors();
Run Code Online (Sandbox Code Playgroud)
当我使用eclipse的调试模式并且我检查列表中的字段时,我在表单中有良好的id.但是在运行时我无法通过这样做获得价值
for (ObjectError fe : result.getAllErrors())
{
fe.getField();
}
Run Code Online (Sandbox Code Playgroud) 我正在通过 Spring MVC 创建一个基本的登录页面。到目前为止,我已经创建了以下内容:
我的单元测试失败,出现以下异常:
org.springframework.beans.NotReadablePropertyException: Invalid property 'login' of bean class [springapp.service.LoginValidator]: 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?
at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:707)
at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:699)
at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99)
at org.springframework.validation.AbstractBindingResult.rejectValue(AbstractBindingResult.java:105)
at springapp.service.LoginValidator.validateUsername(LoginValidator.java:44)
at springapp.service.LoginValidator.validate(LoginValidator.java:27)
at springapp.service.LoginValidatorTests.testEmptyUsernameAndPassword(LoginValidatorTests.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124) …Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习Spring并坚持使用表单验证(有dao/service和所有默认设置)
我尝试进行验证任务,以防止在字段中插入超过3个符号
@Size (min = 1, max = 3)
Run Code Online (Sandbox Code Playgroud)
之后我想将表单数据插入到DB并将其输出到我的主页上,当数据满足我的验证并且由1到3个符号组成时,一切正常,但是当这些条件不满足时我尝试插入4或者更多的符号,我收到了HTTP STATUS 400.没有DB插入,也没有视图输出.所以我理解有验证,但我不明白为什么它会告诉我HTTP STATUS 400
@Controller
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping(value = "addBook", method = RequestMethod.GET)
public String addUser(Model model) {
model.addAttribute("user", new ValidationField());
model.addAttribute("book", new Book());
return "addBook";
}
@RequestMapping(value = "addBook", method = RequestMethod.POST)
public String addBook( @ModelAttribute("user") @Valid ValidationField validationField, Book book, BindingResult result) {
/*this.user(book, result);*/
if (result.hasErrors()) {
return "addBook";
}
this.bookService.addBook(book);
return "redirect:/";
}
}
Run Code Online (Sandbox Code Playgroud)
验证类
public class …Run Code Online (Sandbox Code Playgroud) 我正在尝试利用应用程序服务层上的现有验证框架,该框架在验证失败时会引发 ValidationException。这个异常对象包含多个错误,我想利用 Spring MVC 中的异常处理程序来提取这些错误并将验证消息返回到视图(thymeleaf)。
所以我有两个关于如何做到这一点的问题:
1) 我可以从自定义错误对象列表中手动创建 BindingResult 对象以传递到视图层吗?
2)我可以从基本控制器中的处理程序捕获 ValidationException (可以从多个方法抛出)并让它拦截响应并返回带有验证消息的视图吗?或者我是否必须在每个可能抛出异常的控制器方法中尝试/捕获此异常并在那里提取绑定结果?
显然,如果所有这些都发生在一个地方,如果一个处理程序可以捕获 ValidationException 并将错误消息注入到视图中,那就更好了。但是该方法可以访问返回的模型和视图吗?关于此架构的任何建议都会非常有帮助。
我正在使用 Spring Boot 2.3.8 创建休息服务。我需要验证请求标头,以便它应该具有某些标头,否则会引发错误。这对于所有方法或服务来说应该是通用的。我在下面尝试过,
public ResponseEntity<Object> addEmployee(
@RequestHeader(name = "header1", required = true) String header1,
@RequestHeader(name = "header2", required = true) String header2,
@RequestBody Employee employee)
throws Exception
{
Run Code Online (Sandbox Code Playgroud)
但我需要为所有控制器中的所有方法添加此内容。如果是这种情况,我如何为全局所有服务抛出“请求标头中缺少 Header1”/“请求标头中缺少 header2”之类的错误?
spring-validator ×10
java ×9
spring ×7
spring-mvc ×5
java-ee ×2
validation ×2
hibernate ×1
spring-boot ×1