Java.lang.NoSuchFieldError: INSTANCE

При попытке отправить мою топологию через StormSubmitter я получаю -

Caused by: java.lang.NoSuchFieldError: INSTANCE  
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)

Я использую Spring.

Я не инициализирую HttpClient в Spout/Bolt Constructor. Вместо этого его инициализируется в конструкторе класса, который извлекается из Spring Context in prepare() метода болта

Код структурирован следующим образом -

SomeBolt.java

@Component
public class SomeBolt extends BaseRichBolt {
    private OutputCollector _collector;
    private SomeClient someClient;

    @Override
    public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
        _collector = collector;
        someClient = AppContext.getBean(SomeClient.class);
    }
}

SomeClient.java

@Component
public class SomeClient {
    private final CloseableHttpClient httpClient;

    public SomeClient() {
        this.httpClient = (httpClient == null ? HttpClients.createDefault() : httpClient);
    }
}

AppContext.java

@Component
public class AppContext implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        AppContext.applicationContext = applicationContext;
    }

    public static <T> T getBean(Class<T> c) {
        return applicationContext.getBean(c);
    }
}

Ответ 2

Я столкнулся с подобной проблемой вроде этого: в моем классе путь состоял из двух jar содержит один класс, httpcore-4.3 и apache-httpcomponents-httpcore, я удалил apache-httpcomponents-httpcore из пути класса, разрешившего проблему.

Ответ 3

Суровый - это правильный путь к штурмовому классу.

Итак, что я сделал, чтобы выполнить эту работу, удалите httpclient и httpcore, который поставляется со штормом, и заменил их более новыми версиями 4.3.3 и 4.3.2 соответственно. Это изменяет путь к классам, который использует works/nimbus/supervisor. Вы можете запустить путь штурма, и он напечатает путь класса.

[nimbus ~]$ storm classpath
...../storm-0.8.2/lib/httpclient-4.3.3.jar:..../storm-0.8.2/lib/httpcore-4.3.2.jar.....

Я не уверен, что это очень хорошая работа, я не уверен, какая часть шторма использует эту банку.

если вы посмотрите на код python storm, вы увидите, что он поместит все банки в корне шторма и буря/Библиотека

def get_classpath(extrajars):
    ret = get_jars_full(STORM_DIR)
    ret.extend(get_jars_full(STORM_DIR + "/lib"))
    ret.extend(extrajars)
    return normclasspath(":".join(ret))

Ответ 4

У меня были следующие файлы jar в пути внутри папки плагина:
./Var/Library/Jenkins/плагины/наращивание трубопровода-плагин/WEB-INF/Library/httpcore-4.2.1.jar
. /var/lib/jenkins/plugins/ git-client/WEB-INF/lib/httpcore-4.3.2.jar
. /var/lib/jenkins/plugins/maven -plugin/WEB-INF/lib/httpcore-4.2.4.jar

После этого я удалил следующий файл, он работал у меня
/var/lib/jenkins/plugins/build-pipeline-plugin/WEB-INF/lib/httpcore-4.2.1.jar

Ответ 5

В моем случае основной причиной проблемы был неправильный метод репозитория JPA, который возвратил объект, отличный от ожидаемого.