Сериализация данных весной в mongodb InetSocketAddress - PullRequest
0 голосов
/ 12 января 2020

Прежде всего: я очень новичок в 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> {
}

Я могу сохранить объекты подписки в хранилище, но чтение их в 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 таким образом, чтобы я мог правильно извлечь объект подписки из базы данных?

Заранее спасибо

1 Ответ

1 голос
/ 12 января 2020

InetSocketAddress - это либо имя хоста String, либо InetAddress с портом int.

InetAddress - это в основном массив байтов.

Ни InetSocketAddress, ни InetAddress не могут использоваться в качестве java beans.

Вместо хранения InetSocketAddress сохраните строку, байт [] и порт. А еще лучше, преобразуйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...