我已经创建了一个自定义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,除了我有自己的自定义接收器。
我不清楚原因,但我认为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);
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。