Jax rs rest client - настройка тайм-аута [дубликат]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

19
задан Jens Piegsa 24 April 2015 в 14:08
поделиться

4 ответа

Вы можете сделать это, сначала создав ClientConfig и предоставив его в качестве аргумента при создании нового клиента.

import org.glassfish.jersey.client.ClientProperties;

ClientConfig configuration = new ClientConfig();
configuration.property(ClientProperties.CONNECT_TIMEOUT, 1000);
configuration.property(ClientProperties.READ_TIMEOUT, 1000);
Client client = ClientBuilder.newClient(configuration);
11
ответ дан Jarekczek 20 August 2018 в 10:22
поделиться
  • 1
    Я думаю, вы предполагаете, что я использую трикотаж как реализацию для JAXRS. На самом деле, я использую resteasy. Но я хотел узнать, можно ли это сделать общим способом с использованием чистого API-интерфейса JAX RS 2.0. – sarabdeep singh 27 March 2014 в 20:27
  • 2
    @Jeroen Вы нашли чистое решение? Мне нужно это. – Jdruwe 3 June 2015 в 13:43
  • 3
    Нет общего способа JAX-RS 2.0? – icordoba 8 December 2015 в 19:24
  • 4
    @icordoba Попробуйте: client.property (org.apache.cxf.message.Message.CONNECTION_TIMEOUT, 300000) // 5min .property (Message.RECEIVE_TIMEOUT, 300000) // 5 минут – Custard 25 January 2016 в 16:51
  • 5
    Стандартный способ еще не определен java.net/jira/browse/JAX_RS_SPEC-462 – Dennis Kieselhorst 15 March 2016 в 12:54

С помощью Resteasy это может быть достигнуто путем создания вашего Клиента как такового.

Client client = new ResteasyClientBuilder()
    .establishConnectionTimeout(2, TimeUnit.SECONDS)
    .socketTimeout(2, TimeUnit.SECONDS)
    .build();

Я не видел список стандартных свойств конфигурации, которые вы могли бы установить через ClientBuilder.newClient(Configuration configuration), которые необходимы, чтобы сделать это портативный.

10
ответ дан codylerum 20 August 2018 в 10:22
поделиться
  • 1
    Спасибо @codylerum. Да, я думаю, будет неплохо иметь способ указать такие свойства в классе JAX-RS 2.0 ClientBuilder. – sarabdeep singh 25 July 2014 в 19:52
  • 2
    Остерегайтесь! Это работает только для запросов GET. Для любого другого - есть проблема в интеграции Resteasy- & gt; Apache.HttpClient, которая отбрасывает все конфигурации клиента и заменяет их значениями по умолчанию. – Maxim Karavaev 19 September 2016 в 08:43
  • 3
    @MaximKaravaev каким-либо образом решить то, что вы указываете? Мне также нужно сделать сообщение. – jlanza 20 October 2016 в 11:37
  • 4
    @jlanza Мне нужно добавить зависимости к обеим библиотекам (HTTPClient & amp; RestEASY) и переопределить один метод, что вызывает эту проблему. См. Следующий комментарий для примера кода – Maxim Karavaev 8 December 2016 в 06:54

Во-первых, вы должны добавить соответствующие зависимости (здесь для WildFly 10.1):

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-client</artifactId>
    <version>3.0.14.Final</version>
    <scope>provided</scope>
</dependency>

Далее - создать нормальный Apache HttpClient и нажать на него RestEasy Enginge с переопределением одного метода, который вызывает проблема:

// create here a normal Apache HttpClient with all parameters, that you need
HttpClient httpClient = createHttpClient(connectTimeout,
                                         socketTimeout,
                                         connectionRequestTimeout,
                                         maxTotalHTTPConnections);
// Deprecated Apache classes cleanup https://issues.jboss.org/browse/RESTEASY-1357
// Client Framework not honoring connection timeouts Apache Client 4.3 https://issues.jboss.org/browse/RESTEASY-975
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient) {
        @Override
        protected void loadHttpMethod(ClientInvocation request, HttpRequestBase httpMethod) throws Exception {
            super.loadHttpMethod(request, httpMethod);
            httpMethod.setParams(new BasicHttpParams());
        }
    };

return new ResteasyClientBuilder().httpEngine(engine).build();

Взгляните на https://issues.jboss.org/browse/RESTEASY-975 Кажется, проблема была решена только в версии 3.1.0.Final.

3
ответ дан Maxim Karavaev 20 August 2018 в 10:22
поделиться
  • 1
    Можете ли вы прояснить, разрешено ли это, что теперь работает на запросы POST? В примере в связанном потоке используется GET. – Markus Barthlen 7 February 2017 в 16:53
  • 2
    Я могу подтвердить, что это обходное решение необходимо для 3.1.0.Final и 3.0.20.Final. – Markus Barthlen 24 March 2017 в 15:30
  • 3
    Nevermind, с последней версией httpclient, она работает без обходного пути. – Markus Barthlen 25 March 2017 в 21:55

Примечание: это новый метод, доступный на JAX-RS 2.1

Это очень старшая запись, но приведенный ниже код будет работать как для трикотажа, так и для отдыха

ClientBuilder clientBuilder=null;
clientBuilder=clientBuilder.newBuilder();
clientBuilder.connectTimeout(10,TimeUnit.SECONDS);
clientBuilder.readTimeout(12, TimeUnit.SECONDS);
5
ответ дан Paul Samsotha 20 August 2018 в 10:22
поделиться
  • 1
    Я проголосовал за то, что эти методы не были доступны в ClientBuilder, но затем я проверил JAX-RS 2.1, методы там. Теперь я не могу отменить свое голосование. – abbas 1 May 2018 в 09:10
  • 2
    Голос голосования является необоснованным. Ответ по-прежнему полезен, хотя вопрос о 2.0. В то время, когда задавался вопрос 2.0, он был самым актуальным. Теперь, когда 2.1 является самой актуальной, актуальной информацией. Проголосуйте от меня. – Paul Samsotha 3 May 2018 в 20:37
Другие вопросы по тегам:

Похожие вопросы: