栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

@Autowired bean在控制器上与@Valid一起使用,但对于CRUD存储库失败

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

@Autowired bean在控制器上与@Valid一起使用,但对于CRUD存储库失败

我最终通过指示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。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/635806.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号