java.lang.IllegalAccessException:类 org.apache.tomcat.websocket.pojo.PojoEndpointBase 无法访问带有修饰符“public”的类成员

问题描述 投票:0回答:1

我们的应用程序在 tomcat 8.0.38 上运行。但我们正在将其迁移到 tomcat 9.0.78。我们使用 Java Websocket API 来发送消息。在 tomcat 9.0.78 上部署战争后,我们在 catalina.out 中收到以下错误。

org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen Failed to call onOpen method of POJO end point for POJO of type [com.sample.main.DemoService]
        java.lang.IllegalAccessException: class org.apache.tomcat.websocket.pojo.PojoEndpointBase cannot access a member of class com.sample.main.WebSocketService with modifiers "public"
                at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
                at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
                at java.base/java.lang.reflect.Method.invoke(Method.java:558)
                at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:67)
                at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:46)
                at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:131)
                at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:968)
                at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)
                at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
                at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
                at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
                at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
                at java.base/java.lang.Thread.run(Thread.java:829)

伪代码

package com.sample.main;

class WebSocketService {

private Set<Session> sessionSet;

  public Set<Session> getSessionSet() {
    return sessionSet;
  }

  public void setSessionSet(final Set<Session> sessionSet) {
    this.sessionSet = sessionSet;
  }

void initialize() {
    throw new UnsupportedOperationException();
  }

@OnOpen
  public void open(final Session session, final EndpointConfig config) {
    initialize();
    try {
      sessionSet.add(session);
      final HandshakeRequest httpReq =
          (HandshakeRequest) config.getUserProperties().get(HandshakeRequest.class.getName());
      final Object headers = httpReq == null ? null : httpReq.getHeaders();
      log.info("Websocket got connected with the session: " + session.getId() + " headers " + headers);
    } catch (Exception e) {
      log.error("Error occured in opening session", e);
    }
  }

  @OnClose
  public void close(final Session session) {
    sessionSet.remove(session);
    log.info("Websocket got closed with the session: " + session.getId());
  }

  @OnError
  public void onError(final Session session, final Throwable error) {
    log.error("Error happened in websocket due to " + error.getMessage() + " for session "
        + session.getId());
    close(session);
  }

}

package com.sample.main;

public class DemoService extends WebSocketService {

private static final Set<Session> SESSION_SET = new CopyOnWriteArraySet<>();

@Override
  public void initialize() {
setSessionSet(SESSION_SET);
}

}

有人可以帮忙做一些需要做的事情吗?因为相同的代码在 tomcat 8 中工作正常,但在 tomcat 9 中却不行。

java tomcat8 tomcat9 java-websocket
1个回答
0
投票

由于您没有修饰符

class WebSocketService
,我的想法是您的包无法访问它。尝试添加
protected
修饰符。

© www.soinside.com 2019 - 2024. All rights reserved.