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

使用SpringIOC管理Hibernate拦截器

夏祺然
2023-03-14

我使用Spring Boot v2.0.3和Hibernate 5.2。我想创建一个Hibernate拦截器,在我的一个实体字段中生成一个值,基于我数据库中的一个唯一数字,然后保存。

我获取了一些在线资源,并最终扩展了Hibernate空拦截器,以覆盖onSave方法。

@Component
public class CustomInterceptor extends EmptyInterceptor {

    private final TicketService ticketService;

    @Autowired
    public CustomInterceptor(TicketService ticketService) {
        this.ticketService = ticketService;
    }

    public boolean onSave(Object entity,
                       Serializable id,
                       Object[] state,
                       String[] propertyNames,
                       Type[] types) {

        if (entity instanceof Ticket) {
            if (((Ticket) entity).getNumTicket() == null) {
                String pharmacyId = ((Ticket) entity).getEtablishmentId();

                Long newTicketNumber = ticketService.findMaxNumTicketForEtablishment(etablishmentId);
                // ((Ticket) entity).setNumTicket((newTicketNumber != null ? newTicketNumber : 1));
                for ( int i = 0; i < propertyNames.length; i++ ) {
                    if ( "numTicket".equals( propertyNames[i] ) ) {
                        state[i] = newTicketNumber;
                        return true;
                    }
                }
                return true;
            }
        }
        return false;
    }
}

在我的申请中。yml配置文件,我添加了以下键:

spring.jpa.properties.hibernate.ejb.interceptor: com.mycompany.xxx.utils.CustomInterceptor

当我尝试保存票证时,我可以看到方法onSave被正确调用,但是由于拦截器完全由Hibernate实例化,它不在springbean上下文中,因此我不能使用@Autowire注释。(所以我的票务服务是空的)。

在一个老主题(如何在Spring Boot中使用Spring管理的Hibernate拦截器?)中,我看到有人试图覆盖HibernateJpaAutoConfiguration供应商属性,但它不再可用。

我在Github上发现了这个问题:https://github.com/spring-projects/spring-boot/issues/11211,完美地说明了我的问题,但我无法成功地使其工作(尝试创建HibernatePropertieCustomizer,但我没有使用它)。

如果有人能给我指出正确的方向,我将不胜感激。谢谢

共有1个答案

程钧
2023-03-14

我在Github上发现了这个问题:https://github.com/html" target="_blank">spring-projects/spring-boot/issues/11211,完美地说明了我的问题,

我完全不知道#11211之间有什么关系,因为您报告了在Hibernate管理的组件中使用依赖项注入时出现的问题。

首先,您正在向Hibernate注册一个类(不是bean),因此添加@Component不是一个好主意,因为Hibernate现在负责实例化您的类。如果添加@Component,看起来您希望组件扫描能够处理此对象(而实际上,Hibernate将根据您在配置中提供的FQN来处理它)。

然后,Hibernate添加了一种方法来自定义这种实例化是如何发生的,并且Spring Boot默认从#13717开始自动配置一个SpringBeanContainer,该配置仅在Spring Boot2.1. x中可用。如果您希望能够使用常规依赖注入,您需要升级到Spring Boot 2.1。

 类似资料:
  • 是否可以在Spring Boot中集成Spring托管Hibernate拦截器(http://docs.jboss.org/Hibernate/orm/4.3/manual/en-us/html/ch14.html)? 我正在使用Spring Data JPA和Spring Data REST并需要一个Hibernate拦截器来处理实体上特定字段的更新。 对于标准的JPA事件,不可能获得旧值,因此

  • 问题内容: 我尝试了一些来自hibernate 4.0拦截器的 代码,该代码为使用会话级拦截器提供了以下代码: 但是,我同时检查了hibernate-core 4.0源代码和onliehibernate 4.0 java- doc ,该类没有方法,但是hibernate 3.6 java- doc确实具有此方法。 有人知道该方法移到哪里吗?如果已弃用,为什么文档仍将其保留在教程文档中?在4.0中如

  • 我想在Spring引导中使用hibernate拦截器,以便在提交事务后使用方法执行某些操作。 我遵循如何在Spring Boot中使用Spring管理的Hibernate拦截器进行配置(我只是在中添加) 拦截器可以工作,但当我尝试在方法中获取事务状态时,仍然存在问题,它总是(我希望它可以): 我试着调试它,发现在调用之前, 在扩展了,方法调用方法,该方法调用以设置事务状态: 有人能帮我解决这个问题

  • 我需要的服务: 拦截器: 配置就是这样:

  • 1. 前言 拦截器这个名词定义的非常形象,就像导弹要攻击目标的时候,可能会被先进的反导系统拦截,此处的反导系统就是一种拦截器。 我们开发的应用,对外暴露的是控制器中定义的 API 方法,我们可以在 API 方法的外围放置拦截器,所有对 API 的访问都可以通过拦截器进行过滤。 OK,那么这样的拦截有什么意义吗,其实已经很明显了,反导系统可以保护目标的安全并识别对目标的攻击行为。同理,拦截器可以跟踪

  • 让我有一个这样的界面: 还有这样一个实现类: 现在我想使用bytebuddy创建一个拦截器/代理,它捕捉对setter的调用,存储更改后的值,并调用real方法。 最后,我想向拦截器/代理“询问”被调用的setter和更改的值。 我尝试了很多考虑也教程,但到目前为止,我发现没有工作的解决方案。也许有人可以帮助我。 这是拦截器: 以下是我当前的“测试”代码: 编辑: