Клиент Джерси выбросил исключение NullPointerException на Android - PullRequest
1 голос
/ 21 января 2012

Я пытаюсь использовать атомную ленту, используя библиотеку jersey-client, но без особой удачи.Вот код, который я использую:

    Client client = Client.create();
    ClientResponse response = client.resource("http://192.168.1.65:9998/tweets").accept(MediaType.APPLICATION_ATOM_XML).get(ClientResponse.class);
    String responseString = response.getEntity(String.class);

. Первоначально я получил это исключение:

E / AndroidRuntime (13126): java.lang.NullPointerException E /AndroidRuntime (13126): на javax.ws.rs.core.MediaType.valueOf (MediaType.java:119) E / AndroidRuntime (13126): на> com.sun.jersey.api.client.ClientResponse.getType (ClientResponse.java): 614) E / AndroidRuntime (13126): на com.sun.jersey.api.client.ClientResponse.getEntity (ClientResponse.java:531) E / AndroidRuntime (13126): на com.sun.jersey.api.client.ClientResponse.getEntity (ClientResponse.java:506) E / AndroidRuntime (13126): в com.pivotallabs.tracker.TweetsService.onHandleIntent (TweetsService.java:55) E / AndroidRuntime (13126): в android.app.IntentService $ ServiceHandler $ ServiceHandler(IntentService.java:59) E / AndroidRuntime (13126): на android.os.Handler.dispatchMessage (Handler.java:99) E / AndroidRuntime (13126): на android.os.Looper.loop (Looper.java:130) E / AndroidRuntime (13126): на android.os.HandlerThread.run (HandlerThread.java: 60)

Я пытался использовать решение из этого вопроса - клиент Джерси в Android с буфером протокола - который включал в себя написание пользовательского ServiceIteratorProvider и избавился от первогопроблема, но затем создала новую проблему, где ServiceIteratorProvider искал реализацию com.sun.jersey.client.proxy.ViewProxyProvider.

Я создал поддельную реализацию этого:

public class FakeViewProvider implements com.sun.jersey.client.proxy.ViewProxyProvider {

    public <T> ViewProxy<T> proxy(Client client, Class<T> tClass) {
        Class[] interfaces = new Class[] {tClass};
        return (ViewProxy<T>) Proxy.newProxyInstance(tClass.getClassLoader(), interfaces, new Delegator(interfaces, new Object[]{}));
    }
}

И подключил его непосредственно перед вызовом Client.create:

ServiceFinder.setIteratorProvider (new Buscador ());

... но теперь я получаю эту ошибку вместо:

E / AndroidRuntime (12789): java.lang.NullPointerException E / AndroidRuntime (12789): в com.sun.jersey.spi.service.ServiceFinder.toClassArray (ServiceFinder.java:595) E / AndroidRuntime (12789): на com.sun.jersey.core.spi.component.ProviderServices.getServiceClasses (ProviderServices.java:318) E / AndroidRuntime (12789): на com.sun.jersey.core.spi.component.ProviderServices.getServiceClasses (ProviderServices.java:311) E / AndroidRuntime (12789): на com.sun.jersey.core.spi.component.ProviderServices.getServices (ProviderServices.java:159) E / AndroidRuntime (12789): на ком.sun.jersey.api.client.Client.init (Client.java:249) E / AndroidRuntime (12789): на com.sun.jersey.api.client.Client.access $ 000 (Client.java:118) E / AndroidRuntime(12789): на com.sun.jersey.api.client.Client $ 1.f (Client.java:191) E / AndroidRuntime (12789): на com.sun.jersey.api.client.Client $ 1.f (клиент.java: 187) E / AndroidRuntime (12789): на com.sun.jersey.spi.inject.Errors.processWithErrors (Errors.java:193) E / AndroidRuntime (12789): на com.sun.jersey.api.client.Client. (Client.java:187) E / AndroidRuntime (12789): на com.sun.jersey.api.client.Client. (Client.java:159) E / AndroidRuntime (12789): на com.sun.jersey.api.client.Client.create (Client.java:669)

Я в значительной степени застрял, поэтому, если у кого-то есть какие-либо идеи / они решили эту проблему, это было бы круто!

Ура, Марк

Ответы [ 2 ]

0 голосов
/ 13 мая 2015

Я столкнулся с той же проблемой при тестировании на Asus Memopad и тестовом устройстве galaxyS4. Вот как я это исправил.

 Client client = Client.create();
ClientResponse response = client.resource("http://192.168.1.65:9998/tweets").accept(MediaType.APPLICATION_ATOM_XML).get(ClientResponse.class);

//change to this. pull the input stream from the response and use apache commons to form the input stream into a string
        StringWriter writer = new StringWriter();
    try {
        IOUtils.copy(response.getEntityInputStream(), writer, Charset.defaultCharset());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String theString = writer.toString();
    String output = theString;

вам понадобятся Apache Commons http://commons.apache.org/proper/commons-io/download_io.cgi, чтобы это работало. Надеюсь, это поможет.

0 голосов
/ 21 января 2012

Вы должны свернуть свой код в
if(response.getStatus() == Response.Status.OK && response.hasEntity()){...} Вы уверены, что запрос возвращает непустой ответ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...