编程语言
首页 > 编程语言> > java – JpaRepository不在自定义RichSinkFunction中自动装配

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