首先,我对Spring非常陌生,因此,如果无法提供问题所必需的所有信息,对不起。我的问题如下:我有以下类要保存在mongoDB中的对象

public class Subscription implements Serializable {

    private String type;
    private InetSocketAddress host;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public InetSocketAddress getHost() {
        return host;
    }

    public void setHost(InetSocketAddress host) {
        this.host = host;
    }


    public Subscription(){}



通过定义一个存储库接口并将其自动装配到我的应用程序中(对于另一个存储库工作正常),可以做到这一点

public interface SubscriptionRepository extends MongoRepository<Subscription, String> {
}


我可以将Subscription对象保存到存储库中,但是通过List<Subscription>将它们读取到SubscriptionRepository.findall()中会给我一个错误

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.net.InetSocketAddress]: No default constructor found; nested exception is java.lang.NoSuchMethodException: java.net.InetSocketAddress.<init>()


查看数据库,InetSocketAddress对象保存得很奇怪

{ "_id" : ObjectId("5e1a48f4a6e30c7d2089e5cd"), "type" : "test", "host" : { "holder" : { "addr" : { "holder" : { "address" : 174417169, "family" : 1 }, "_class" : "java.net.Inet4Address" }, "port" : 0 } }, "_class" : "com.example.myproject.Subscription" }


为了以某种方式保存InetSocketAddress字段,以便可以从数据库正确检索订阅对象,我必须更改什么?

先感谢您

最佳答案

InetSocketAddress是字符串主机名或具有int端口的InetAddress。

一个InetAddress基本上是一个字节数组。

InetSocketAddress和InetAddress都不能用作Java Bean。

而不是存储InetSocketAddress,而是存储String,byte []和端口。更好的是,将byte []转换为IP地址的字符串表示形式,并仅存储字符串和端口,该字符串可以是主机名或IP地址作为字符串。然后添加一个在需要时构造InetSocketAddress的方法。还要为端口和String主机/地址添加设置器和获取器。

public class Subscription implements Serializable {

    private String type;

    // instead of InetSocketAddress
    private String host;
    private int port;

    public InetSocketAddress getSocketAddress() {
            return new InetSocketAddress(host, port);
    }

    // setters and getters

09-26 09:14