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

Hibernate验证-自动连线返回空值

曹茂材
2023-03-14

环顾四周后,我找不到解决这个问题的好办法。

我的自动连线没有按预期工作,返回null。我已经在其他类中自动连接了这个特定的类,它可以工作,所以它只在constraintvalidator类中不工作。

UserService类

@Service
public class UserService {

    @Autowired
    private UserRepository userRep;
    
    public void addUser(User user) {
        userRep.save(user);
    }
    
    
    public void deleteUser(long userId) {
        userRep.deleteById(userId);
    }
    
    public List<User> retrieveAllUsers(){
        Iterable<User>temp =userRep.findAll();
        List<User>allUsers = null;
        temp.forEach(allUsers::add);
        return allUsers;
    }
    
    public boolean searchByEmail(String email) {
        return userRep.findByEmail(email);
    }
    
    public void updateUser(User user) {
        userRep.save(user);
    }
}

注释接口类

 @Target(ElementType.FIELD) 
    //When will the annotation be processed compilation, runtime etc
    @Retention(RetentionPolicy.RUNTIME)
    //Where is the logic
    @Constraint(validatedBy = EmailValidator.class)
    @Documented
    public @interface ValidEmail {
        
        //Error message
        String message() default "Invalid email";
        //Required for annotation
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
        
    }

注释逻辑类。这里的自动连线返回null

public class EmailValidator implements ConstraintValidator<ValidEmail, String> {

    @Autowired
    private UserService service;
    //Actual place to place the logic to check if the data is valid or not
    @Override
    public boolean isValid(String email, ConstraintValidatorContext context) {
        if (email == null) {
        return false;
        }
        
        List<User> users = service.retrieveAllUsers();
        if (users.size() > 0) { 
        return Pattern.matches("(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])", email)
                && service.searchByEmail(email);
        }
        
        else {
            return Pattern.matches("(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])", email);
        }
        }
        
    
    
    @Override
    public void initialize(ValidEmail validEmail) {
        validEmail.message();
    }

}

主要的

@SpringBootApplication
@ComponentScan(basePackages = {
        "com.Alex.Mains", "com.Alex.UserPackage", "com.Alex.Flights", "com.Alex.Security"
})
@EntityScan( basePackages = {"com.Alex.UserPackage", "com.Alex.Flights"})
@EnableJpaRepositories({"com.Alex.UserPackage", "com.Alex.Flights"})
public class JpaApplication {

    public static void main(String[] args) {
        SpringApplication.run(JpaApplication.class, args);
    }
    
//  @Bean
//  public Validator validator(final AutowireCapableBeanFactory beanFactory) {
//
//      ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
//              .configure()
//              .constraintValidatorFactory(new SpringConstraintValidatorFactory(beanFactory))
//              .buildValidatorFactory();
//
//      return validatorFactory.getValidator();
//  }
    
}

编辑:尝试@Componenet

共有2个答案

郝原
2023-03-14

编辑:我的建议

使用现有的@EMail和唯一约束,而不是自定义验证器:

@Entity
public class User {
  // ...your properties

  @Email
  @Column(unique = true)
  private String email.

  // Rest of class...
}

旧:

所以,首先:

List<User> users = service.retrieveAllUsers();
    if (users.size() > 0) { 

您正在从数据库中获取所有用户,只是为了检查是否存在任何用户?这是非常非常低效的。如果您已经在使用Spring数据,您可以这样做

@Query("SELECT COUNT(*) > 0 FROM Users")
boolean anyExists();

此外,您的服务不会被注入,因为EmailValidator是一个POJO(普通的旧java对象),而不是Spring管理的组件。如果用@Component@Service注释,Spring将负责注入。

但是我不建议这样做。我不确定你的确切用例是什么,但是验证器经常在实体上使用,因此,当实体创建或更新时,它们会被调用。在这些情况下,你不想发出额外的查询。

就像我说的,我不知道你到底想实现什么,但是你可以使用现有的@Email验证器(你甚至可以提供一个带有regexp属性的自定义正则表达式)。

郎子平
2023-03-14

修正了在应用程序中添加以下内容。财产。不知道为什么,但它是有效的

spring.jpa.properties.javax.persistence.validation.mode=none
 类似资料:
  • 我在RMI服务中的@autowired对象上收到一个空指针异常。我创建了一个简单的(我认为)服务,可以通过RMI从客户端调用。代码如下 heartbeat-servlet.xml代码如下: 我的指定组件扫描的WebConfiguration文件如下: My HeartbeatImpl.java在包中com.edvs.service所以应该扫描它,并且应该实例化@autowyah HostStatu

  • 问题内容: 能否请您告诉我,我如何才能很好地为Hibernate实体启用Spring自动装配? 假设我有一个实体,并希望在那里有邮件发送者: 有没有比做的更好的方法 在我的DAO中? 谢谢! 问题答案: 有可能的!(这是Spring Roo中的默认样式!) 您所需要做的就是将@Configurable批注添加到您的实体。在配置中并使用AspectJ编织激活注释。 Spring参考中有一章:7.8.

  • 问题内容: 我在将环境连接到Spring项目时遇到问题。在这个班上 环境始终为null。 问题答案: 自动装配发生的时间比所谓的晚(由于某种原因)。 一种解决方法是实现并依赖Spring调用方法:

  • 以下代码在isValid()函数内的teamResource自动连线对象上生成null: 团队资源类: 如果相关的话。。。 到底为什么teamResources是null? 它没有在任何其他地方用new显式初始化。

  • 我试图在MessageBoxDAO类中自动连接jdbctemplate(我想它工作得很好),然后我在控制器中创建自动连接的DAO对象来获取最新的ID,以防止获取重复的ID,并从它结束的地方开始。 代码如下: 由于我未知的原因,“dao”为空,因此无法构造计数器,程序停止 我刚接触spring boot,我知道这可能是一个非常简单的问题,但有人能指出我错在哪里吗?