首先,我对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