我们的应用程序在 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 中却不行。
由于您没有修饰符
class WebSocketService
,我的想法是您的包无法访问它。尝试添加 protected
修饰符。