我正在使用 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/