我有一个ServerEndpoint类,一旦我尝试从客户端连接到它,就会抛出此错误。我认为缺少某种依赖,即一个缺少另一个jar的捆绑库,尽管它可能是其他一些问题。
我在服务器日志中看到以下堆栈跟踪,没有其他信息。
An exception or error occurred in the container during the request processing
java.lang.NoClassDefFoundError: Could not initialize class org.example.ServerSocketEndpoint
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
at org.glassfish.tyrus.core.ReflectionHelper.getInstance(ReflectionHelper.java:807)
at org.glassfish.tyrus.core.DefaultComponentProvider.create(DefaultComponentProvider.java:60)
at org.glassfish.tyrus.core.ComponentProviderService.getInstance(ComponentProviderService.java:232)
at org.glassfish.tyrus.core.ComponentProviderService.getEndpointInstance(ComponentProviderService.java:293)
at org.glassfish.tyrus.server.TyrusServerEndpointConfigurator.getEndpointInstance(TyrusServerEndpointConfigurator.java:160)
at org.glassfish.tyrus.core.AnnotatedEndpoint$1.getEndpointInstance(AnnotatedEndpoint.java:144)
at org.glassfish.tyrus.core.ComponentProviderService.getInstance(ComponentProviderService.java:149)
at org.glassfish.tyrus.core.AnnotatedEndpoint.callMethod(AnnotatedEndpoint.java:452)
at org.glassfish.tyrus.core.AnnotatedEndpoint.onError(AnnotatedEndpoint.java:507)
at org.glassfish.tyrus.core.TyrusEndpointWrapper.onConnect(TyrusEndpointWrapper.java:657)
at org.glassfish.tyrus.core.TyrusWebSocket.onConnect(TyrusWebSocket.java:141)
at org.glassfish.tyrus.core.TyrusWebSocketEngine$TyrusConnection.<init>(TyrusWebSocketEngine.java:611)
at org.glassfish.tyrus.core.TyrusWebSocketEngine$SuccessfulUpgradeInfo.createConnection(TyrusWebSocketEngine.java:556)
at org.glassfish.tyrus.servlet.TyrusHttpUpgradeHandler.init(TyrusHttpUpgradeHandler.java:111)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:777)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:745)
]]
如何获取更多相关信息?我正在使用--debug运行服务器。
我还在域配置中添加了以下内容以监控类加载:
<jvm-options>-verbose:class</jvm-options>
<jvm-options>-XX:LogFile=${com.sun.aas.instanceRoot}/logs/jvm.log</jvm-options>
<jvm-options>-XX:+LogVMOutput</jvm-options>
是否有可能进一步增加冗长度?
我在Linux x64上运行GlassFish Server开源版4.0(版本89),使用最新的Oracle Java 7 JDK&amp; Tyrus 1.7
欢迎任何想法。
端点被剥离到核心;我试图留下任何可能导致问题的事情:
@ServerEndpoint(
value = "/main",
encoders = { BinaryEncoder.class }, // TextEncoder.class
decoders = { BinaryDecoder.class } // TextDecoder.class
)
@Stateful
public class ServerSocketEndpoint implements IServerSocketEndpoint
{
static {
logger = Debug.getLogger(ServerSocketEndpoint.class);
ds = DB.initDs();
gson = GsonPlus.create();
sessions = Collections.synchronizedSet(new HashSet<Session>());
peers = Collections.synchronizedSet(new HashSet<ISocketPeer>());
}
protected static final DataSource ds;
protected static final Logger logger;
protected static final Gson gson;
protected static final Set<Session> sessions;
protected static final Set<ISocketPeer> peers;
protected TyrusSession _session; // TyrusSession implements JSR-356 Session
protected long _socketSessionId;
protected BasicPeer _peer;
public static void send(final Session session, Msg msg)
{
RemoteEndpoint.Async remote = session.getAsyncRemote();
if (session.isOpen())
{
try {
remote.sendObject(msg);
logger.log(Level.INFO, String.format("send() msg: %s", msg.toJson(gson)));
}
catch (IllegalArgumentException ex) {
Logger.getLogger(ServerSocketEndpoint.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public ServerSocketEndpoint()
{
}
@Override
public void close(CloseReason closeReason)
{
if (_session == null)
return;
try {
_peer.free();
_session.close(closeReason);
_session = null;
}
catch (IOException ex) {
methodException(ex);
}
}
@OnOpen
public void onOpen(Session session, EndpointConfig config)
{
_session = (TyrusSession)session;
if (ds == null) {
// No connection available somehow - nothing to do except log the error
}
InetAddress clientExtIp;
try {
clientExtIp = InetAddress.getByName(_session.getRemoteAddr());
}
catch (UnknownHostException ex) {
}
try (Connection dbc = ds.getConnection())
{
CallableStatement proc = dbc.prepareCall("{call newSocketSession(?, ?, ?, ?, ?, ?)}");
proc.setBytes("extIp", clientExtIp.getAddress());
proc.setString("extHostName", clientExtIp.getHostName());
proc.registerOutParameter("id", Types.BIGINT);
if (proc.execute()) {
// Process results
}
// Stash a reference to this DB socket session
_socketSessionId = proc.getLong("id");
}
catch (SQLException ex) {
methodException(ex);
}
}
@OnError
public void onError(Session session, Throwable ex)
{
methodException(ex);
}
@OnMessage
public void onMessage(final Session session, Msg msg) throws IOException, EncodeException
{
// deal with messages
}
@OnClose
public void onClose(Session session)
{
sessions.remove(session);
_session = null;
_peer = null;
}
}
好的,所以我得到它与Pavel的帮助。
所以我的问题更具体地说明如下:是否存在诊断CNFE错误的非暴力方法,即没有解构&amp;一块一块地重新构建端点?