java.lang.размышляйте.Исключение InaccessibleObjectException: Не удается сделать поле закрытым конечным переходным адресом java.net.InetSocketAddress

#java #spring #spring-boot #spring-data-elasticsearch

Вопрос:

Я пытаюсь удалить эластичные документы в массовом количестве, но "java.lang.reflect.InaccessibleObjectException: Unable to make field private final transient java.net.InetSocketAddress" при выполнении получаю исключение elasticsearchOperations.delete(...) . Вот код, не в состоянии понять, что его вызывает. Мы очень ценим любую помощь.

 private void deleteElasticDocuments(String catalogId) {
    List<String> docIdList = new ArrayList<>(250);
    String queryText = martServerContext.getQueryCacheInstance().getQuery(QUERY_PORTAL_GET_OBJECTS_IN_PORTAL_BY_MODEL);
    MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource();
    mapSqlParameterSource.addValue("cId", Integer.parseInt(catalogId));
    namedParameterJdbcTemplate.query(queryText, mapSqlParameterSource, (resultSet -> {
        int objectId = resultSet.getInt(O_ID);
        String docId = catalogId   objectId;
        docIdList.add(docId);
        if (docIdList.size() == 250) {
            Query query = new NativeSearchQueryBuilder()
                    .withQuery(QueryBuilders.idsQuery().addIds(docIdList.toArray(String[]::new)))
                    .build();
            elasticsearchOperations.delete(query, IndexCoordinates.of("portal_idx"));
            docIdList.clear();
        }
        // elasticsearchOperations.delete(docId, IndexCoordinates.of("portal_idx"));
    }));
    if (docIdList.size() < 250) {
        Query query = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.idsQuery().addIds(docIdList.toArray(String[]::new)))
                .build();
        elasticsearchOperations.delete(query, IndexCoordinates.of("portal_idx"));
        docIdList.clear();
    }
}
 

Ответ №1:

Вместе с запросом и индексом я добавил свой класс MetadataSearch.class , и теперь он работает.

 elasticsearchOperations.delete(query, MetadataSearch.class, IndexCoordinates.of("portal_idx"));
 

Правка (П. Дж. Мейш):

Позвольте мне объяснить, почему вы получили эту ошибку. Вы вызывали функцию с подписью

 ElasticsearchOperations.delete(Object, IndexCoordinates)
 

Здесь ElasticsearchOperations принимает первый параметр как объект сущности, который должен быть удален, и пытается найти его идентификатор-свойство. Обычно вы бы передали экземпляр MetadataSearch в вашем случае. Spring Data Elasticsearch уже знал бы, какими свойствами обладает этот объект при первоначальной настройке.

Но теперь он получает объект, который является NativeSearchQuery и который не известен как тип сущности, и поэтому Spring Data Elasticsearch анализирует объект и его свойства, и это сводится к свойствам свойств …

NativeSearchQuery имеет свойство типа RequestBuilder , у этого есть a SearchRequest , которое, в свою очередь, содержит a TransportAddress , а у этого есть an InetSocketAddress . И здесь проверка завершается неудачей с ошибкой, которую вы видите.

Таким образом, действительно, использование delete варианта, принимающего запрос, класс сущности и координаты индекса-правильный путь. Если ваш MetadataSearch класс аннотирован, @Document(indexName="portal_idx") вы можете опустить последний параметр.

Комментарии:

1. Спасибо за объяснение, да, класс MetadataSearch снабжен аннотацией @Document с именем индекса.