私は現在、Spring Social を使用して Twitter と通信する Java アプリケーションに取り組んでいます。アプリケーションは、Spring Data (JPA) を使用してユーザーをローカルで管理します。
Twitter でアクセスを承認し、Twitter が OAuth1 コールバック URL にリクエストを行うと、アプリケーションが停止し、ログ ファイルに次のように表示されます (スタック トレースを短縮しました)。
ERROR 2013-08-18 16:05:09,511 http-bio-8080-exec-44] org.springframework.transaction.interceptor.TransactionInterceptor [TransactionAspectSupport.completeTransactionAfterThrowing
(): "Application exception overridden by rollback exception"]
org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [insert into UserConnection (userId, providerId, providerUserId, ra
nk, displayName, profileUrl, imageUrl, accessToken, secret, refreshToken, expireTime) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; SQL state [null]; error code [0]; You can't operate
on a closed Connection!!!; nested exception is java.sql.SQLException: You can't operate on a closed Connection!!!
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)
...
Caused by: java.sql.SQLException: You can't operate on a closed Connection!!!
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)
at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:171)
at org.springframework.jdbc.core.JdbcTemplate$SimplePreparedStatementCreator.createPreparedStatement(JdbcTemplate.java:1438)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:581)
... 94 more
Caused by: java.lang.NullPointerException
at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:135)
... 96 more
[WARN 2013-08-18 16:05:09,513 http-bio-8080-exec-44] org.springframework.social.connect.web.ConnectController [ConnectController.oauth1Callback(): "Exception while handling OAuth1 callback (Could not roll back JPA transaction; nested exception is javax.persistence.PersistenceException: unexpected error when rollbacking). Redirecting to twitter connection status page."]
いくつかの調査の後、私は本質的にここで説明されている問題を見ていると信じています: https://jira.springsource.org/browse/SOCIAL-384
何らかの理由で、Spring Social コアが JdbcUsersConnectionRepository を使用するという事実は、私の JPA セットアップではうまく機能しません。プラグインが利用可能であることを理解しています。しかし、データソース構成を試してみることに決め、2 つの本質的に同一のデータソース Bean 構成 (異なる名前) を作成し、1 つを Spring Social に結び付け、もう 1 つをエンティティ マネージャー構成に結び付けました。
この設定により、上記のエラーは解消され、Twitter ユーザー接続がデータベースに永続化されていることがわかります。私の質問は次のとおりです。このようなことを行うのは有効な解決策ですか? 重複するデータソースが必要になるその他のシナリオにはどのようなものがありますか? 反対に、このような構成を使用すると、どのような影響が考えられますか?