开发者社区> 问答> 正文

JpaRepository不在自定义RichSinkFunction中自动装配

我已经创建了一个自定义Flink RichSinkFunction并试图JpaRepository在这个自定义类中自动装配,但我不断得到一个NullPointerException。如果我在构造函数中自动装配它,我可以看到已找到JpaRepo - 但是当调用invoke方法时,我会收到一个NullPointerException。

public interface MessageRepo extends JpaRepository {
}

@Component
public class MessageSink extends RichSinkFunction {

private final transient MessageRepo messageRepo; //if i don't make this transient, i get the error message "The implementation of the RichSinkFunction is not serializable"

@Autowired
public MessageSink(MessageRepo messageRepo){
    this.messageRepo = messageRepo;
    messageRepo.save(new Message()); //no issues when i do this
}

@Override
public void invoke(Message message, Context context) {
     // the message is not null
     messageRepo.save(message); // NPE
}

以前有没有人遇到过这个问题?看起来MessageSinkinvoke方法是在一个单独的线程中调用的,这就是为什么messageRepo总是null?我的代码的其他部分能够使用MessageRepo,除了我有自己的自定义接收器。

展开
收起
flink小助手 2018-12-06 18:01:12 2773 0
1 条回答
写回答
取消 提交回答
  • flink小助手会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关flink的问题及回答。

    我不清楚原因,但我认为spring boot在注入bean时优先考虑你的服务类。当我尝试为我的Entity类编写一个监听器时,我遇到了类似的问题。这就是我解决它的方式。创建一个实现ApplicationContextAware接口的组件类,并覆盖setApplicationContext方法。在你的类中有一个名为getBean的静态方法,它将在你的第一个请求时自动装配。示例代码---

    @Component
    public class SpringBeansUtil implements ApplicationContextAware {
    private static ApplicationContext context;

    @SuppressWarnings("static-access")
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) 
    throws BeansException {
    this.context = applicationContext;

    }

    public static <T> T getBean(Class<T> beanClass) {
        return context.getBean(beanClass);
    }

    }
    然后只需在代码中获取bean ------- >> ClassName referenceName =(ClassName)SpringBeansUtil.getBean(ClassName.class);

    2019-07-17 23:18:38
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载