相关疑难解决方法(0)

JSR303自定义验证器被调用两次

我正在使用Spring MVC创建一个网站,并且我正在使用Spring Data JPA和Hibernate 4作为我的JPA提供程序.目前正在使用Hibernate Validator处理验证.我有一个问题,我的验证器被调用两次,我无法弄清楚为什么.这是一个问题的主要原因是因为第二轮,依赖关系没有自动连接到验证器,我得到一个空指针异常.以下是导致失败的呼叫序列:

  1. 提交注册表单,首先调用NotDefaultSectValidator并成功完成用户对象上的"whereDidYouHearAboutUs"字段.
  2. 接下来调用UniqueUsernameValidator并成功完成"用户名"字段验证.
  3. 控制器上的'addUserFromForm'方法启动,并在bindingResults对象中找不到任何错误.
  4. 然后在UserService类上调用'addUser'方法.此方法到达'userRepository.save(user);'行 但之后不要立即运行'print.ln'行.单步执行此行将返回到"NotDefaultSectValidator"断点.这是第二次完成,我重新输入第二个验证器'UniqueUsernameValidator'.这里我得到一个空指针异常,因为出于某种原因,Spring第二次无法在DAO中自动装配.

任何人都可以阐明验证器被调用两次的原因,特别是为什么要跨越'userRepository.save(user);' 回到这些验证器?

非常感谢

这是我的user.java类

package com.dating.domain;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.annotations.Type;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import org.joda.time.LocalDate;
import org.springframework.format.annotation.DateTimeFormat;

import com.dating.annotation.NotDefaultSelect;
import com.dating.annotation.UniqueUsername;

@Entity
@Table(name = "dating.user")
public class User {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy …
Run Code Online (Sandbox Code Playgroud)

java validation spring jpa bean-validation

10
推荐指数
2
解决办法
3755
查看次数

带有 BindingResult 的 Spring 4 @Validation 注释不起作用

当我使用BindingResult@Validated一个方法的注释,验证无法正常工作。如果我BindingResult从方法参数中删除,它工作正常。我用过@ControllerAdvice

知道为什么它不起作用吗?

我的代码如下:

public ResponseEntity<?> dologin(
        @Validated({ Group.Login.class }) @RequestBody User user,
        BindingResult errors)
{
    // somecode
}
Run Code Online (Sandbox Code Playgroud)

根据验证、数据绑定和类型转换文档,任何验证消息都将自动添加到绑定器的BindingResult.

去掉不会有影响吧?

java spring spring-validator

5
推荐指数
1
解决办法
6546
查看次数

HV000028: isValid 调用期间出现意外异常

我创建了一个自定义验证规则来检查数据库中是否存在用户名。

我的 User 类有一个用户名,该用户名具有自定义验证规则,当创建对象时,它会在数据库中检查是否存在相同的用户名。

我使用 aninterface UserRepository extends JpaRepository<User, Integer>将用户保存到数据库中,并在自定义验证规则中检查用户名是否已存在。我利用

@Autowired
UserRepository userRepository;
Run Code Online (Sandbox Code Playgroud)

我可以单独验证用户并将其保存到数据库中,但是当一起使用它们时(例如在自定义验证规则中调用),userRepository.save(user);不会@Autowired UserRepository userRepository;启动,因此它保持为空。

javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.
Run Code Online (Sandbox Code Playgroud)

自定义验证规则

public class UsernameConstraintValidator implements ConstraintValidator<Username, String> {
    
    @Autowired
    UserRepository userRepository;

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        return !userRepository.existsUserByUsername(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试将用户保存在控制器中

  @PostMapping("/save")
    public String save(@Valid @ModelAttribute("user") User user,BindingResult result, @RequestParam String password2){

        if(result.hasErrors()) return "register";

       userRepository.save(user);
               
        return "login";
    }
Run Code Online (Sandbox Code Playgroud)

我的问题的说明

spring dependency-injection spring-data-jpa

2
推荐指数
1
解决办法
7429
查看次数