Изключение при дублиран запис при използване на GoogleAuthorizationCodeFlow с JdoCredentialStore и DataNucleus

Имам проблем с GoogleAuthorizationCodeFlow (Java). Опитвам се да изградя връзка с Google Календар за моя уеб проект, използвайки „OAuth 2.0 на Google за приложения за уеб сървър“. Следователно можете да използвате Java API библиотеките на Google.

Използвам AuthorizationCallbackServlet на Google, за да получа токен за достъп и опресняване.

GoogleAuthorizationCodeFlow запазва създадените идентификационни данни с GoogleAuthorizationCodeFlow и техния JdoCredentialStore. Като реализация на JDO използвам DataNucleus.

static PersistenceManagerFactory pmf;

    static{ 
        Properties properties = new Properties(); 
        properties.setProperty("javax.jdo.PersistenceManagerFactoryClass",
              "org.datanucleus.api.jdo.JDOPersistenceManagerFactory");
        properties.setProperty("javax.jdo.option.ConnectionDriverName","com.mysql.jdbc.Driver");
        properties.setProperty("javax.jdo.option.ConnectionURL","jdbc:mysql://localhost:3306/rssparsetest");
        properties.setProperty("javax.jdo.option.ConnectionUserName","root");
        properties.setProperty("javax.jdo.option.ConnectionPassword","root");
        pmf = JDOHelper.getPersistenceManagerFactory(properties);

    }
public static CredentialStore JDO_CREDENTIAL_STORE = new JdoCredentialStore(pmf);
public static AuthorizationCodeFlow AUTHORIZATION_CODE_FLOW = getNewAuthorizationCodeFlow();

public static AuthorizationCodeFlow getNewAuthorizationCodeFlow(){
    return new GoogleAuthorizationCodeFlow.Builder(Constants.HTTP_TRANSPORT, Constants.JSON_FACTORY,
            Constants.CLIENT_ID, Constants.CLIENT_SECRET,
            Collections.singleton(CalendarScopes.CALENDAR)).setCredentialStore(Constants.JDO_CREDENTIAL_STORE).setAccessType("offline")
            .build();
}

Използване в Bean без състояние:

public List<CalendarListEntry> getCalendarList() {  
    Credential credential = null;


    AuthorizationCodeFlow authCodeFlow = Constants.getNewAuthorizationCodeFlow();

    try {
        credential = authCodeFlow.loadCredential("USERID");
    } catch (Exception e) {
    //...
}

Всичко работи добре (мога да изброявам записите си в календара, идентификационните данни се запазват в моята база данни на MySQL) с изключение че идва време за справка на токена за достъп с токена за постоянно опресняване (какво прави GoogleAuthorizationCodeFlow).

Caused by: javax.jdo.JDODataStoreException: Duplicate entry 'USERID' for key 'PRIMARY'
NestedThrowables:
java.sql.BatchUpdateException: Duplicate entry 'USERID' for key 'PRIMARY'
at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:421)
at org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:735)
at org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:755)
at com.google.api.client.extensions.jdo.auth.oauth2.JdoCredentialStore.store(JdoCredentialStore.java:47)

За да обобщя, мога да

  1. Получаване и запазване на идентификационните данни с accessToken и refreshToken
  2. Списък на записи в календара (стига времето на маркера за достъп да не е изтекло)

Не мога да опресня своя маркер за достъп с GoogleAuthorizationCodeFlow, без да получа изключение „javax.jdo.JDODataStoreException: Дублиран запис „USERID“ за ключ „PRIMARY“.

какво правя грешно

Благодаря ви много за вашата помощ!


person user1515786    schedule 10.07.2012    source източник


Отговори (1)


Под „опресняване“ вероятно имате предвид „продължаване“, тъй като това е, което правите. И това е постоянен такъв със същия "id" като съществуващ. Ако сте искали да го актуализирате, тогава го извличате и актуализирате и той се актуализира в хранилището за данни. Ако това е някаква библиотека на Google, която поддържа постоянството зад кулисите, тогава ги попитайте къде в техния API е възможно извикване за „актуализация“.

person DataNucleus    schedule 11.07.2012
comment
Маркирах го с DataNucleus, защото мислех, че може да има етикет, който да бъде зададен, за да се избегне това изключение. Да, GoogleAuthorizationCodeFlow запазва обекта Credential след актуализиране на неговия маркер за достъп. - person user1515786; 11.07.2012