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

Hibernate拦截器中autowired字段的空指针异常(类由Spring管理)

司空胤
2023-03-14

我需要的服务:

@Service
public class CommentServiceImpl implements CommentService {

    private CommentRepository commentRepository;

    private TargetTypeRepository targetTypeRepository;

    @Autowired
    public CommentServiceImpl(final CommentRepository commentRepository, final TargetTypeRepository targetTypeRepository) {
        this.commentRepository = commentRepository;
        this.targetTypeRepository = targetTypeRepository;
    }

    @Override
    public List<Comment> getComments(String targetType, Long targetId) {
        TargetType targetTypeEntity = targetTypeRepository.findByCode(targetType);
        return commentRepository.findByTargetTypeAndTargetId(targetTypeEntity, targetId);
    }

    @Override
    public void deleteComments(String targetType, Long targetId) {
        List<Comment> comments = getComments(targetType, targetId);
        commentRepository.deleteAll(comments);
    }
}

拦截器:

@Component
public class MvaSupportInterceptor extends EmptyInterceptor {

    private static final long serialVersionUID = 1L;

    @Autowired
    private CommentService commentService;

    @Override
    public void onDelete(Object entity, Serializable id, Object[] state,String[] propertyNames, Type[] types)
    {
        if (entity instanceof DraftDoc)
        {
            commentService.deleteComments("DRAFT_DOC", ((DraftDoc)entity).getId()); //NPE
        }
        super.onDelete(entity, id, state, propertyNames, types);
    }
}

配置就是这样:

@SpringBootApplication
public class RestApplication {

    public static void main(String[] args) {
        SpringApplication.run(RestApplication.class, args);
    }
}

共有1个答案

欧阳狐若
2023-03-14

原因是以一种注册拦截器的方式:

spring.jpa.properties.hibernate.ejb.interceptor=my.package.MyInterceptorClassName.

它不允许在拦截器内使用bean。

建议的方法对我不起作用,因为我的Spring Boot版本是2.2:
如何在Spring Boot中使用Spring managed Hibernate拦截器?

@Configuration
public class HibernateConfiguration extends HibernateJpaAutoConfiguration{


    @Autowired
    Interceptor userInterceptor;


    @Override
    protected void customizeVendorProperties(Map<String, Object> vendorProperties) {
        vendorProperties.put("hibernate.ejb.interceptor",userInterceptor);
    }
}
@Component
class MyHibernateInterceptorCustomizer implements HibernatePropertiesCustomizer {

    @Autowired
    MyInterceptor myInterceptor

    @Override
    void customize(Map<String, Object> hibernateProperties) {
       hibernateProperties.put("hibernate.session_factory.interceptor", myInterceptor);
    }
}
 类似资料:
  • 我的项目是基于spring mvc的,我写了一个拦截器来拦截请求,我想从请求中获取参数,下面是我的代码: 但现在它抛出了一个异常: 出现例外的原因是什么?

  • 我得到一个空指针异常在我的code.Please帮我解决它。这是我的代码。 这是我的原木猫。 第138行为点击法-

  • 问题内容: 有可能这可能是一个双重问题。我将String变量初始化为null。我可能会或可能不会使用一个值更新它。现在我想检查此变量是否不等于null以及我尝试执行的操作是否会得到null指针异常。空指针异常,因为它代价高昂。是否有任何有效的解决方法.TIA 问题答案: 如果您使用 你 不会 得到。 我怀疑你在做什么: 这是因为null 而引发,而不是因为null。 如果仍然无法解释,请发布您用于

  • 我已经更新了我的项目中的一些依赖关系之后,我的Hibernate配置类显示Nullpointerx的。 我将SpringDataJPA存储库与hibernate一起使用,已经超过24小时了,仍然没有找到任何关于小问题的适当解决方案。 我已经尝试过的一些解决方案:- 使用@bean(name=“entityManagerFactory”)提供bean名称 我面临的问题 波姆。xml文件 配置类 db

  • 我对spring有点陌生,我遇到了一个空指针异常。我认为在我的MongoRepository上不起作用。由于某种原因,当我试了一些例子时,它起作用了。(运行函数中注释掉的代码起作用) 这是我得到的错误: 2016-05-20 02:31:20.877错误6272---[nio-8080-exec-2]O.A.C.C.C.[.[.[/].[dispatcherServlet]:路径为[]的上下文中s

  • 我试图在列表视图的onItemClick中用另一个片段替换片段,我想将所选项目名称从列表片段发送到另一个片段,但它显示空指针异常 @覆盖onItemClick上的公共无效(AdapterView ar0,视图,int位置,长id){ 但是同样的概念在下面的按钮点击中工作