首先:我对 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(){}
我通过定义一个存储库接口(interface)并将其 Autowiring 到我的应用程序中(这对于另一个存储库来说效果很好)来做到这一点
public interface SubscriptionRepository extends MongoRepository<Subscription, String> {
}
我可以将订阅对象保存到存储库中,但将它们读入 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 beans。
不存储 InetSocketAddress,而是存储 String、byte[] 和端口。更好的是,将 byte[] 转换为 IP 地址的字符串表示形式,并仅存储字符串和端口,该字符串可以是主机名,也可以是字符串形式的 IP 地址。然后添加一个在需要时构造 InetSocketAddress 的方法。还为端口和字符串主机/地址添加 setter 和 getter。
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
关于java - Spring data mongodb 序列化 InetSocketAddress,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59699441/