2011-12-16 27 views
0

我想使用協議緩衝區在Android中創建一個澤西客戶端。 我使用下列庫: 球衣,客戶1.8.jar 球衣核-1.8.jar 的protobuf-java的2.4.0a.jar在協議緩衝區的Android澤西客戶端

我寫的代碼:

import com.sun.jersey.api.client.ClientRequest; 
import com.sun.jersey.api.client.ClientResponse; 
import com.sun.jersey.api.client.WebResource; 
import com.sun.jersey.api.client.WebResource.Builder; 
import com.sun.jersey.api.client.filter.ClientFilter; 
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter; 

BaseRestClient client = BaseRestClient.create("", ""); 

HTTPBasicAuthFilter authenticationFilter = 
    new HTTPBasicAuthFilter(username, password); 

client.addFilter(authenticationFilter); 
.......... 
.......... 
WebResource webResourceGetMea = client.resource(url); 
webResourceGetMea = webResourceGetMea.path("/accounts").path("/login"); 
ClientResponse responseGetMea = webResourceGetMea.type("application/x-protobuf").get(ClientResponse.class); 

上述代碼作爲Java main()應用程序成功運行,但是當我在Android上運行時,responseGetMea()對象爲null(最後一行代碼)。

我正在使用「application/x-protobuf」,因爲這樣它就是在服務器端定義的。 我在Android應用程序中添加了INTERNET權限。 我也檢查了Android瀏覽器的URL,當我點擊它時,它會提示我輸入用戶名和密碼(預期的行爲)。

我真的很感激任何幫助。

問候, kalgik

回答

0

我採用在所提供的溶液,

java.lang.NullPointerException on Android

提議

盧卡斯文,2010年8月25日; 9:15 am

它的工作方式就像一個魅力。

[編輯] 那麼,小評論/更正。在HTC手機中運行,導致應用程序在我最小化(不確定這是否正常)並重新打開時銷燬/創建。建議的解決方案要求Jersey客戶端對象和ServiceFinder設置應該在靜態上下文中進行。這應該給一個線索,

private static final BaseRestClient client; 
static { 
    client = BaseRestClient.create("", ""); // just a helper class 
    ServiceFinder.setIteratorProvider(new Buscador()); 
} 

否則,類加載修復抱怨在一個相當奇怪的方式。希望這可以幫助別人......

乾杯!

1

此外...當在上一個鏈接上嘗試使用Buscador的版本進行POST時,它會抱怨一些錯誤。 Buscador的新版本張貼工作如下,

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Iterator; 

import com.sun.jersey.spi.service.ServiceFinder; 
import com.sun.jersey.spi.service.ServiceFinder.DefaultServiceIteratorProvider; 
import com.sun.jersey.spi.service.ServiceFinder.ServiceIteratorProvider; 

public class Buscador<T> extends ServiceIteratorProvider<T> 
{ 
private static final HashMap<String, String[]> SERVICES = new HashMap<String, String[]>(); 

private static final String[] com_sun_jersey_spi_HeaderDelegateProvider = new String[] { 
     "com.sun.jersey.core.impl.provider.header.LocaleProvider", 
     "com.sun.jersey.core.impl.provider.header.EntityTagProvider", 
     "com.sun.jersey.core.impl.provider.header.MediaTypeProvider", 
     "com.sun.jersey.core.impl.provider.header.CacheControlProvider", 
     "com.sun.jersey.core.impl.provider.header.NewCookieProvider", 
     "com.sun.jersey.core.impl.provider.header.CookieProvider", 
     "com.sun.jersey.core.impl.provider.header.URIProvider", 
     "com.sun.jersey.core.impl.provider.header.DateProvider", 
     "com.sun.jersey.core.impl.provider.header.StringProvider" 

}; 
private static final String[] com_sun_jersey_spi_inject_InjectableProvider = new String[] { 
     "com.sun.jersey.core.impl.provider.xml.SAXParserContextProvider", 
     "com.sun.jersey.core.impl.provider.xml.XMLStreamReaderContextProvider", 
     "com.sun.jersey.core.impl.provider.xml.DocumentBuilderFactoryProvider", 
     "com.sun.jersey.core.impl.provider.xml.TransformerFactoryProvider" 
}; 
private static final String[] javax_ws_rs_ext_MessageBodyReader = new String[] { 
     "com.sun.jersey.core.impl.provider.entity.StringProvider", 
     "com.sun.jersey.core.impl.provider.entity.ByteArrayProvider", 
     "com.sun.jersey.core.impl.provider.entity.FileProvider", 
     "com.sun.jersey.core.impl.provider.entity.InputStreamProvider", 
     "com.sun.jersey.core.impl.provider.entity.DataSourceProvider", 
     "com.sun.jersey.core.impl.provider.entity.RenderedImageProvider", 
     "com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider", 
     "com.sun.jersey.core.impl.provider.entity.FormProvider", 
     "com.sun.jersey.core.impl.provider.entity.FormMultivaluedMapProvider", 
     "com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App", 
     "com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$Text", 
     "com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General", 
     "com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$App", 
     "com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text", 
     "com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General", 
     "com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$App", 
     "com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$Text", 
     "com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General", 
     "com.sun.jersey.core.impl.provider.entity.ReaderProvider", 
     "com.sun.jersey.core.impl.provider.entity.DocumentProvider", 
     "com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader", 
     "com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader", 
     "com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader", 
     "com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$App", 
     "com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$Text", 
     "com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General", 
     "com.sun.jersey.core.impl.provider.entity.EntityHolderReader" 
}; 
private static final String[] javax_ws_rs_ext_MessageBodyWriter = new String[] { 
     "com.sun.jersey.core.impl.provider.entity.StringProvider", 
     "com.sun.jersey.core.impl.provider.entity.ByteArrayProvider", 
     "com.sun.jersey.core.impl.provider.entity.FileProvider", 
     "com.sun.jersey.core.impl.provider.entity.InputStreamProvider", 
     "com.sun.jersey.core.impl.provider.entity.DataSourceProvider", 
     "com.sun.jersey.core.impl.provider.entity.RenderedImageProvider", 
     "com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider", 
     "com.sun.jersey.core.impl.provider.entity.FormProvider", 
     "com.sun.jersey.core.impl.provider.entity.FormMultivaluedMapProvider", 
     "com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App", 
     "com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$Text", 
     "com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General", 
     "com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$App", 
     "com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text", 
     "com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General", 
     "com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$App", 
     "com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$Text", 
     "com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General", 
     "com.sun.jersey.core.impl.provider.entity.ReaderProvider", 
     "com.sun.jersey.core.impl.provider.entity.DocumentProvider", 
     "com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider", 
     "com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter" 
}; 

static 
{ 
    SERVICES.put("com.sun.jersey.spi.HeaderDelegateProvider", 
     com_sun_jersey_spi_HeaderDelegateProvider); 
    SERVICES.put("com.sun.jersey.spi.inject.InjectableProvider", 
     com_sun_jersey_spi_inject_InjectableProvider); 
    SERVICES.put("javax.ws.rs.ext.MessageBodyReader", javax_ws_rs_ext_MessageBodyReader); 
    SERVICES.put("javax.ws.rs.ext.MessageBodyWriter", javax_ws_rs_ext_MessageBodyWriter); 
} 

DefaultServiceIteratorProvider defaultServiceIteratorProvider = new ServiceFinder.DefaultServiceIteratorProvider(); 

@SuppressWarnings("unchecked") 
@Override 
public Iterator<Class<T>> createClassIterator(Class<T> service, String serviceName, 
    ClassLoader loader, boolean ignoreOnClassNotFound) 
{ 
    String[] classesNames = SERVICES.get(serviceName); 

    System.out.println("!!!!!!!!!!!! serviceName: " + serviceName + " !!!!!!!!!!!!!!!!!!!"); 

    if(classesNames==null) 
    { 
     return defaultServiceIteratorProvider.createClassIterator(service, serviceName, loader, ignoreOnClassNotFound); 
    } 

    int length = classesNames.length; 
    ArrayList<Class<T>> classes = new ArrayList<Class<T>>(length); 
    for (int i = 0; i < length; i++) 
    { 
     try 
     { 
      classes.add((Class<T>) Class.forName(classesNames[i])); 
     } catch (ClassNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    //return null; 
    return classes.iterator(); 
} 

@Override 
public Iterator<T> createIterator(Class<T> service, String serviceName, ClassLoader loader, 
    boolean ignoreOnClassNotFound) 
{ 
    String[] classesNames = SERVICES.get(serviceName); 
    int length = classesNames.length; 
    ArrayList<T> classes = new ArrayList<T>(length); 
    for (int i = 0; i < length; i++) 
    { 
     try 
     { 
      classes.add(service.cast(Class.forName(classesNames[i]).newInstance())); 
     } catch (IllegalAccessException e) 
     { 
      e.printStackTrace(); 
     } catch (InstantiationException e) 
     { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    return classes.iterator(); 
} 

}

0

如果有人有興趣在這些例外here的原因的解釋。