2012-09-11 63 views
1

在我的项目中,我尝试使用twitter4j来集成twitter。我尝试使用示例代码在办公室登录,并且可以成功发布tweet这一点,但回来到家里,我现在面临的JCE.Jar奇怪的问题,它说尝试在Twitter上登录时无法获得HmacSHA1“消息验证码”(MAC)

Failed to get HmacSHA1 "Message Authentication Code" (MAC) 
    java.security.NoSuchAlgorithmException: Algorithm HmacSHA1 not available 
at javax.crypto.Mac.getInstance(DashoA13*..) 
at twitter4j.auth.OAuthAuthorization.generateSignature(OAuthAuthorization.java:317) 
at twitter4j.auth.OAuthAuthorization.generateAuthorizationHeader(OAuthAuthorization.java:227) 
at twitter4j.auth.OAuthAuthorization.generateAuthorizationHeader(OAuthAuthorization.java:273) 
at twitter4j.auth.OAuthAuthorization.getAuthorizationHeader(OAuthAuthorization.java:75) 
at twitter4j.internal.http.HttpClientImpl.setHeaders(HttpClientImpl.java:237) 
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:113) 
at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:65) 
at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:102) 
at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:121) 
at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:104) 
at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:276) 
at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:269) 
at org.twitterstats.App.main(App.java:23) 
    Exception in thread "main" java.lang.AssertionError: java.security.NoSuchAlgorithmException: Algorithm HmacSHA1 not available 
at twitter4j.auth.OAuthAuthorization.generateSignature(OAuthAuthorization.java:337) 
at twitter4j.auth.OAuthAuthorization.generateAuthorizationHeader(OAuthAuthorization.java:227) 
at twitter4j.auth.OAuthAuthorization.generateAuthorizationHeader(OAuthAuthorization.java:273) 
at twitter4j.auth.OAuthAuthorization.getAuthorizationHeader(OAuthAuthorization.java:75) 
at twitter4j.internal.http.HttpClientImpl.setHeaders(HttpClientImpl.java:237) 
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:113) 
at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:65) 
at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:102) 
at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:121) 
at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:104) 
at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:276) 
at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:269) 
at org.twitterstats.App.main(App.java:23) 
    Caused by: java.security.NoSuchAlgorithmException: Algorithm HmacSHA1 not available 
at javax.crypto.Mac.getInstance(DashoA13*..) 
at twitter4j.auth.OAuthAuthorization.generateSignature(OAuthAuthorization.java:317) 
... 12 more 


<dependencies> 
    <dependency> 
     <groupId>org.twitter4j</groupId> 
     <artifactId>twitter4j-core</artifactId> 
     <version>[2.2,)</version> 
    </dependency> 

码登录到Twitter是有点像这个样子。

public static void main(String args[]) thrwos Exception{ 
// The factory instance is re-useable and thread safe. 
Twitter twitter = new TwitterFactory().getInstance(); 
twitter.setOAuthConsumer("[consumer key]", "[consumer secret]"); 
RequestToken requestToken = twitter.getOAuthRequestToken(); 
AccessToken accessToken = null; 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
while (null == accessToken) { 
    System.out.println("Open the following URL and grant access to your account:"); 
    System.out.println(requestToken.getAuthorizationURL()); 
    System.out.print("Enter the PIN(if aviailable) or just hit enter.[PIN]:"); 
    String pin = br.readLine(); 
    try{ 
    if(pin.length() > 0){ 
     accessToken = twitter.getOAuthAccessToken(requestToken, pin); 
    }else{ 
     accessToken = twitter.getOAuthAccessToken(); 
    } 
    } catch (TwitterException te) { 
    if(401 == te.getStatusCode()){ 
     System.out.println("Unable to get the access token."); 
    }else{ 
     te.printStackTrace(); 
    } 
    } 
} 
//persist to the accessToken for future reference. 
storeAccessToken(twitter.verifyCredentials().getId() , accessToken); 
Status status = twitter.updateStatus(args[0]); 
System.out.println("Successfully updated the status to [" + status.getText() + "]."); 
System.exit(0); 
} 
private static void storeAccessToken(int useId, AccessToken accessToken){ 
    //store accessToken.getToken() 
    //store accessToken.getTokenSecret() 
    } 

回答

1

虽然我不是很清楚为什么这个问题发生,但只是尝试版本升级到Java 7的,它的工作!

+0

在使用不同框架的问题后,我测试了一些JDK。使用JDK1.6 64位版本时,似乎发生此错误。 JDK 1.6,32bit运行良好! – dube