相关疑难解决方法(0)

如何在Spring Boot项目中禁用Hibernate验证

我有一个spring boot项目,它有一个CrudRepository,一个Entity和一个Controller.我基本上试图根据传递给Controller的数据来持久化实体.

要做到这一点,我正在使用spring-boot-starter-jpa.我的实体使用JSR-303注释进行注释,将数据传递给CrudRepository以进行持久化之前,在控制器中对其进行检查.

控制器方法:

@RequestMapping(value = "users", method = { RequestMethod.POST })
public SuccessfulResponse<User> addUser(@Valid @RequestBody User user, BindingResult validation) {
    if (validation.hasErrors()) {
        throw new ValidationException(validation);
    }
    User saved = this.users.save(user);
    return new SuccessfulResponse<User>(saved);
}
Run Code Online (Sandbox Code Playgroud)

实体:

@Entity /* JPA */
public class User {

   @Id /* JPA */
   @Column(name="email_address", nullable=false, length=255) /* JPA */
   @UserUnique
   private String emailAddress;

}
Run Code Online (Sandbox Code Playgroud)

我的问题的原因是UserUnique注释.它的验证器如下所示:

public class UserUniqueValidator implements ConstraintValidator<UserUnique, String> {

   private UserRepository users;

   @Autowired …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa bean-validation spring-boot

29
推荐指数
1
解决办法
3万
查看次数

使用带有spring 3.1.0.release的hibernate 4.0的eventlisteners?

这些罐子都是新发布的,并且拥有最新的Java EE应用程序解决方案.但是我在hibernate.cfg.xml中指定hibernate监听器时遇到了问题.

在春季3.1.0之前,LocalSessionFactroyBean持有一个保存eventlisteners的属性.但是使用3.1.0.release没有eventlisteners地图.现在我无法在saveorupdate,postload等上保持模态对象的跟踪,因为它们不是由Spring配置的.你有想法解决这个问题吗?

java event-listener spring-3 hibernate-4.x

19
推荐指数
2
解决办法
3万
查看次数

Autowired Repository在自定义约束验证器中为空

我有一个基于Spring的webapp.我在控制器中使用了几个带注释@Repository,@ Transaction的存储库类.那部分工作正常.

我创建了一个Custom Constraint Validator,它必须访问存储库.现在我无法理解为什么Repository为null.我尝试使用@Component注释来注释验证器.我的基本包包含所有这些类是在xml的一部分.那么我还应该做些什么来确保存储库依赖注入工作.这就是我的Constraint验证器的样子.

public class DonorTypeExistsConstraintValidator implements
    ConstraintValidator<DonorTypeExists, DonorType> {

  @Autowired
  private DonorTypeRepository donorTypeRepository;

  @Override
  public void initialize(DonorTypeExists constraint) {

  }

  public boolean isValid(DonorType target, ConstraintValidatorContext context) {

   System.out.println("donorType: " + target);
   if (target == null)
     return true;

   try {
    if (donorTypeRepository.isDonorTypeValid(target.getDonorType()))
     return true;
   } catch (Exception e) {
    e.printStackTrace();
   }
   return false;
  }

  public void setDonorRepository(DonorTypeRepository donorTypeRepository) {
    this.donorTypeRepository = donorTypeRepository;
  }
}
Run Code Online (Sandbox Code Playgroud)

更新

包扫描配置:

<context:annotation-config />

<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />

<context:component-scan …
Run Code Online (Sandbox Code Playgroud)

java validation spring hibernate bean-validation

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

Spring Boot 2.0.0 M6-添加休眠拦截器

从Spring Boot 2.0.0 M2升级到2.0.0 M6后,我的Hibernate拦截器实现不再起作用。

我以前的实现:

@Configuration
public class HibernateConfiguration extends HibernateJpaAutoConfiguration {

    private HibernateStatisticsInterceptor hibernateStatisticsInterceptor;

    public HibernateConfiguration(DataSource dataSource, JpaProperties jpaProperties, ObjectProvider<JtaTransactionManager> jtaTransactionManager, ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers, ObjectProvider<List<SchemaManagementProvider>> providers, HibernateStatisticsInterceptor hibernateStatisticsInterceptor) {
        super(dataSource, jpaProperties, jtaTransactionManager, transactionManagerCustomizers, providers);
        this.hibernateStatisticsInterceptor = hibernateStatisticsInterceptor;
    }

    @Override
    protected void customizeVendorProperties(Map<String, Object> vendorProperties) {
        vendorProperties.put("hibernate.session_factory.interceptor", hibernateStatisticsInterceptor);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是使用M5或M6时,HibernateJpaAutoConfiguration类已更改,并且不再扩展JpaBaseConfiguration。

我尝试为每个YAML配置文件添加拦截器,但是它不起作用。

我的拦截器:

@Component("hibernateStatisticsInterceptor")
public class HibernateStatisticsInterceptor extends EmptyInterceptor {

    private static final long serialVersionUID = 5278832720227796822L;

    private ThreadLocal<Long> queryCount = new ThreadLocal<>();

    public void startCounter() {
        queryCount.set(0l);
    }

    public …
Run Code Online (Sandbox Code Playgroud)

hibernate interceptor spring-boot

5
推荐指数
3
解决办法
1958
查看次数

Spring Boot - Hibernate 自定义约束不注入服务

我将尝试忽略其他细节并使其简短:

@Entity
public class User
    @UniqueEmail
    @Column(unique = true)
    private String email;
}

@Component
public class UniqueEmailValidatior implements ConstraintValidator<UniqueEmail,String>, InitializingBean {

    @Autowired private UserService userService;

    @Override
    public void initialize(UniqueEmail constraintAnnotation) {

    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if(userService == null) throw new IllegalStateException();
        if(value == null) return false;
        return !userService.isEmailExisted(value);
    }

}
Run Code Online (Sandbox Code Playgroud)

这将在 Spring 中进行验证(Spring MVC@Valid或注入Validatorusing @Autowire)时起作用,一切都会好起来的。但是一旦我使用 Spring Data JPA 保存实体:

User save = userRepository.save(newUser);
Run Code Online (Sandbox Code Playgroud)

Hibernate 将尝试在UniqueEmailValidatior不注入UserServicebean 的情况下实例化一个新的。那么如何让 …

spring hibernate-validator spring-boot

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