Jakarta ee 在JavaEEWebSocket中存储字段

Jakarta ee 在JavaEEWebSocket中存储字段,jakarta-ee,websocket,java-ee-7,Jakarta Ee,Websocket,Java Ee 7,我已经使用一个脚本创建了一个javaee websocket端点。参数和会话分别存储在@OnOpen字段中 websocket侦听一些事件,并使用path参数将一些数据发送到会话 问题是,在捕获事件时,这两个字段都为空。这是什么原因?每个会话是否有多个端点实例?我阅读了:如果开发人员使用默认的ServerEndpointConfig.Configurator,那么每个活动客户端连接将恰好有一个端点实例。 下面是示例代码: @ServerEndpoint(value = "/allbookings

我已经使用一个脚本创建了一个javaee websocket端点。参数和会话分别存储在@OnOpen字段中

websocket侦听一些事件,并使用path参数将一些数据发送到会话

问题是,在捕获事件时,这两个字段都为空。这是什么原因?每个会话是否有多个端点实例?我阅读了:如果开发人员使用默认的ServerEndpointConfig.Configurator,那么每个活动客户端连接将恰好有一个端点实例。 下面是示例代码:

@ServerEndpoint(value = "/allbookings/{projectId}", encoders = {JSONEncoder.class},
                configurator = WebSocketUserConfig.class)
public class BookingsByProject {

    private Session session;
    private String  projectId;

    @OnOpen
    public void open(Session session, EndpointConfig conf, @PathParam(PROJECT_ID_KEY) String projectId) {
        if(projectId!=null){
            this.session = session;
            this.projectId = projectId;
        } else {
            session.close();
        }
    }

    @OnClose
    public void close(Session session, CloseReason reason) {
        log.debug("Session closed.");
    }

    public void createdEventFired(@Observes @Created Booking entity) {
        if(session.isOpen){
            session.getAsyncRemote().sendObject(converter.from(null, repo.getBookingsByProjectId(projectId)));
        }
    }

}
问题是,在CreateDevenFired会话和projectId上始终为空!为什么?

为完整起见,此处configurator仅添加了一个用户属性:

public class WebSocketUserConfig extends ServerEndpointConfig.Configurator {
    /**
     * Key used in config to mark if requesting user is admin.
     */
    public static final String IS_ADMIN_ADMIN = "isAdmin";

    @Override
    public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {
        config.getUserProperties().put(IS_ADMIN_ADMIN, request.isUserInRole(UserRole.ADMIN.name()));
        super.modifyHandshake(config, request, response);
    }

}

你能提供更多的信息吗?简化的端点代码+握手请求转储等。您还需要发布配置程序。似乎会话为空问题是由于没有与CDI和Tyrus共享同一实例造成的-我在endpoint类上没有看到任何CDI注释,因此事件很可能会在不同的实例上调用。只需添加System.out.printXXX+这个,然后查看将记录什么。PathParam是否确实为空?在@OnOpen方法中似乎没有问题,而您遇到的问题只是第一个问题。我的主要问题是:spec说每个会话只有一个实例=活动客户端连接!configurator只设置了一个用户属性-我将在每个会话的一个实例上添加代码,即使在您的情况下仍然有效-问题是CDI事件在该范围之外触发-不幸的是,没有@WebSocketSessionScoped或类似的内容-因此CDI将创建新实例,因为它确实知道关于websocket/Tyrus的任何事情……但这对每一个类都很重要——如果它们都创建新实例,那么事件就根本不起作用了?!除此之外,什么是有效的解决方案?