当前位置: 首页 > 知识库问答 >
问题:

如何用java从mongoDB读取文档并通过websockets发送文档?

公良玺
2023-03-14

我是java新手,想从mongoDB集合中读取随机数据,并通过websockets将其发送到一个简单的websocket客户端。实际上,我运行了一个tomcat,它部署了我的java应用程序(websocketserver)。这是一个简单的websocket echo服务器,用于回复来自客户端的消息。

      package websocket.chat;


        import com.mongodb.MongoClient;
        import javax.websocket.*;
        import javax.websocket.server.*;
        import java.io.IOException;


        @ServerEndpoint(value="/echo")
        public class EchoEndpoint {

            MongoAccess mongo;


            @OnOpen
            public void onOpen(Session session, EndpointConfig config) throws IOException {
               System.out.println("open");
    mongo = new MongoAccess(new MongoClient("localhost",27017));



   session.getBasicRemote().sendText(mongo.readNumberOfDocuments(10).toString());



            }

            @OnMessage
            public String echo(String message) {

                System.out.println("Server answer");
                return message + " (from your server)";

            }

            @OnError
            public void onError(Throwable t) {

                System.out.println("Error!!!");
                t.printStackTrace();
            }

            @OnClose
            public void onClose(Session session) {



                System.out.println("close");

            }
        }

现在我想在OnMessage事件中发送来自mongoDB的数据。为此,我创建了三个类。

类 Nr.1,用于从集合中读取数据

package websocket.chat;


import com.mongodb.*;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

import java.net.UnknownHostException;


import java.util.ArrayList;
import java.util.List;

public class MongoAccess {


    private DBCollection collection;



    //Konstruktor
    public MongoAccess(MongoClient mongo)
    {
        this.collection = mongo.getDB("randomData").getCollection("random");
    }


    //read all datasets
    public List<Dataset> readAllDocuments(){

        List<Dataset> data = new ArrayList<Dataset>();

        //Cursor object to iterate over set of documents
        DBCursor cursor = collection.find();

            while(cursor.hasNext()){
                System.out.println(cursor.next());
                DBObject doc = cursor.next();
                Dataset d = DataConverter.convertDBobject(doc);
                data.add(d);

            }
        return data;

    }


    //read a number of datasets
    public List<Dataset> readNumberOfDocuments(int number) {


        //query, less then equal number
        BasicDBObject query = new BasicDBObject(("data_id"), new BasicDBObject("$lte", number));

        //Cursor object to iterate over set of documents that matched our query
        DBCursor cursor = collection.find(query);

        List<Dataset> data = new ArrayList<Dataset>();


            while (cursor.hasNext()) {
                System.out.println(cursor.next());
                DBObject doc = cursor.next();
                Dataset d = DataConverter.convertDBobject(doc);
                data.add(d);
            }

        return data;

    }

}

类 Nr.2:数据对象

 package websocket.chat;


public class Dataset {

    private Integer data_id;
    private Float X;
    private Float Y;
    private Float Z;

    public Integer getData_id() {
        return data_id;
    }

    public void setData_id(Integer data_id) {
        this.data_id = data_id;
    }

    public Float getX() {
        return X;
    }

    public void setX(Float x) {
        X = x;
    }

    public Float getY() {
        return Y;
    }

    public void setY(Float y) {
        Y = y;
    }

    public Float getZ() {
        return Z;
    }

    public void setZ(Float z) {
        Z = z;
    }


}

类Nr.3:转换DBObject

import com.mongodb.BasicDBObjectBuilder;



public class DataConverter {

    //convert DBObject to Dataset Object
    public static Dataset convertDBobject(DBObject doc)
    {
        Dataset d = new Dataset();
        d.setData_id((int)doc.get("data_id"));
        d.setX((float)doc.get("x"));
        d.setY((float)doc.get("y"));
        d.setZ((float)doc.get("z"));
        return d;

    }

}

当我尝试连接到websocket服务器时,websockent连接会抛出以下错误:

    java.lang.NoClassDefFoundError: com/mongodb/DBObject
    at websocket.chat.EchoEndpoint.onOpen(EchoEndpoint.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:65)
    at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:64)
    at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:133)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:844)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: com.mongodb.DBObject
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
    ... 15 more

我试着找出错误,但我什么也没找到。有什么想法吗?

共有1个答案

罗华翰
2023-03-14

我发现了我的错误。我使用tomcat来部署应用程序。所以我忘了将mongo-java-driver.jar添加到tomcat lib文件夹中。因此,tomcat服务器在运行时找不到这个类。

 类似资料:
  • 问题内容: 我正在尝试编写一个JavaScript应用程序,该应用程序将在页面的iFrame中加载按钮。此应用程序将读取父文档并删除所有图像,应用最小的样式,然后使用此新标记的页面重新加载父文档。 我遇到的问题是从iFrame读写父文档。有人知道实现此目标的方法吗?我已经阅读了一些有关跨域消息传递的内容,但是不确定其他选择,哪种方法最好。 提前致谢。 问题答案: 您可以使用父对象或始终指向最外面文

  • 我正在尝试上传文件,我正在使用“角度文件上传”。正在尝试连接并将文件发送到mongodb,但它在firebug上出现此错误 网络::错误_不安全_响应 在mongodb.log日志文件中,它显示连接已完成: 2014-11-09T11:57:05.512 0400 I网络[initandlisten]连接已从xxx接受。x、 x.x:53749#2(1个连接现在打开) 2014-11-09T11:

  • 本文向大家介绍使用Java从MongoDB检索数据时如何跳过文档?,包括了使用Java从MongoDB检索数据时如何跳过文档?的使用技巧和注意事项,需要的朋友参考一下 从MongoDB集合中检索记录时,可以使用skip()方法跳过结果中的记录。 句法 Java MongoDB库提供了一个具有相同名称的方法,以跳过记录,并绕过表示要跳过的记录数的整数值来调用此方法(基于find()方法的结果)。 示

  • 问题内容: 我需要从文件中读取内容(它们都是变量,当然不是常量)。最简单的方法是什么? 问题答案: 这个怎么样:

  • 问题内容: 我在应用程序中使用MongoDB,需要在MongoDB集合中插入多个文档。我使用的版本是1.6 我在这里看到一个例子 http://docs.mongodb.org/manual/core/create/ 在里面 批量插入多个文档 部分 作者传递数组的位置。 当我尝试同样的操作时,但是为什么不允许这样做,请告诉我如何一次插入多个文档? 请让我知道这是什么方法,以便可以通过java一次插

  • 我创建了一个索引(house),其类型为“公寓”,包含20个文档。我使用postman将Json作为二进制文件上传到elasticsearch。我有一个Spring Boot项目,它有以下几个类: > 埃斯孔菲格。java-我已经配置了clustername,它是应用程序中的默认名称。属性文件。 partments.java-这是我的数据模型。这些文档在elasticsearch中有以下字段。 A