spring - 尝试通过 websocket 转换和发送时出现空指针异常

标签 spring postgresql hibernate websocket spring-data-jpa

我正在使用 hibernate 和 JpaRepository + PostgreSQL。我有以下代码监听对数据库所做的任何修改。

public class PermitEntityListener {

    @PrePersist
    public void prePersist(Permit target) {
        perform(target, INSERTED);
    }

    @PreUpdate
    public void preUpdate(Permit target) {
        perform(target, UPDATED);
    }

    @PreRemove
    public void preRemove(Permit target) {
        perform(target, DELETED);
    }

    @Transactional(MANDATORY)
    private void perform(Permit target, Action action) {
        EntityManager entityManager = BeanUtil.getBean(EntityManager.class);
        entityManager.persist(new PermitHistory(target, action));
        //Send permitHistory to client via websocket to update changes
        PermitUpdates updates = new PermitUpdates();
        updates.sendUpdatedPermit(new PermitHistory(target, action));
    }
}

在执行方法中,所做的更改将更新到新表中。此时,我还希望通过网络套接字将此“PermitHistory”发送回用户。这样一来,当用户修改/查看表格时,在客户端,他将能够收到提示,告知对字段进行了新的更改,以便他可以选择刷新以显示更新。

我创建了一个新类“PermitUpdates”

public class PermitUpdates {

    @Autowired
    private SimpMessagingTemplate template;

    public void sendUpdatedPermit(PermitHistory permitHistory) {
        if (permitHistory != null) {
            this.template.convertAndSend("/changes", permitHistory);
        }
    }
}

我还添加了一个 WebSocketConfig 类

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/changes");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket").withSockJS();
    }

}

发生错误:

Caused by: java.lang.NullPointerException
    at com.example.historical.websoc.PermitUpdates.sendUpdatedPermit(PermitUpdates.java:19)

我做错了什么?我如何让 spring 为我创建对象?

最佳答案

PermitUpdates 的第 19 行是这样的:this.template.convertAndSend("/changes", permitHistory);?如果没有注入(inject)模板,因为 PermitUpdates 不是由 Spring 创建的(参见 PermitEntityListener 方法 private void perform(Permit target, Action action) PermitUpdates 更新 = new PermitUpdates())

您必须让 spring 手动创建对象或注入(inject)属性。

关于spring - 尝试通过 websocket 转换和发送时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54551478/

相关文章:

spring - 从Spring依赖管理插件中提取依赖版本

java - 尝试为 Spring、Spring WebFlow、Hibernate 等设置我的第一个 Maven POM,但出现错误

ruby-on-rails - java.sql.SQLException : FATAL: no pg_hba. 主机的 conf 条目

c - Postgres libpq 如何判断连接是否已终止

xml - 使用 MOXy 避免循环,@XmlInverseReference @XmlID

java - hibernate ,获取重复值

java - 作为原始类型 'forEach()' 的成员对 'java.lang.Iterable' 进行未经检查的调用

java - 我可以在 Spring 中设置默认的 AnnotationBeanNameGenerator 吗?

sql - postgres 中的触发器

java - 将新的 transient 字段添加到现有的@Enity