我最终通过指示Spring
EntityManagerFactoryBean使用我的验证器bean(更准确地说,hibernate将使用Spring的验证器)解决了这个问题:
<bean id="emf" > <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter"> <bean /> </property> <property name="packagesToScan" value="some.packages"/> <property name="jpaPropertyMap"> <map> <entry key="javax.persistence.validation.factory" value-ref="validator" /> </map> </property> <property name="jpaProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.max_fetch_depth">3</prop> <prop key="hibernate.jdbc.fetch_size">50</prop> <prop key="hibernate.jdbc.batch_size">10</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean>
但是,这引发了错误:)
显然,此问题的原因是我的验证器正在使用finder方法(
findByUsername),并且finder方法触发了hibernate刷新,这又触发了验证。这将无限循环,直到您获得最著名的异常为止。
所以…我通过更改验证器以直接使用EntityManager(而不是CRUD存储库)并暂时将FlushModeType更改为COMMIT来解决此问题。这是示例:
public class UniqueUsernamevalidator implements ConstraintValidator<UniqueUsername, String> { @PersistenceContext private EntityManager em; @Autowired UserService userService; @Override public void initialize(UniqueUsername constraintAnnotation) {} @Override public boolean isValid(String username, ConstraintValidatorContext context) { try { em.setFlushMode(FlushModeType.COMMIT);return userService.findByUsername(username) == null; } finally { em.setFlushMode(FlushModeType.AUTO);} }}
这解决了验证器使用查找程序功能触发hibernate刷新的问题,而hibernate刷新又触发了验证器,从而导致StackOverflowError。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)