java – JpaRepository不在自定义RichSinkFunction中自动装配
作者:互联网
我创建了一个自定义的Flink RichSinkFunction并试图在这个自定义类中自动装配JpaRepository,但我不断得到一个NullPointerException.
如果我在构造函数中自动装配它,我可以看到找到了JpaRepo – 但是当调用invoke方法时,我收到一个NullPointerException.
public interface MessageRepo extends JpaRepository<Message, Long> {
}
@Component
public class MessageSink extends RichSinkFunction<Message> {
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
}
以前有没有人遇到过这个问题?看起来MessageSink调用方法是在一个单独的线程中调用的,这就是为什么messageRepo总是为空?
我有自己的自定义接收器时,我的代码的其他部分可以使用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);
标签:java,spring,spring-data-jpa,apache-flink,flink-streaming 来源: https://codeday.me/bug/20190701/1346235.html