YouTube Data API の
org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class com.google.api.client.util.DateTime.
Codec が
参考サイト
Library version
関連 Liblary の
- YouTube Data API (v3)
<dependency> <groupId>com.google.apis</groupId> <artifactId>google-api-services-youtube</artifactId> <version>v3-rev178-1.22.0</version> </dependency>
- Java Mongo Driver
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.2.2</version> </dependency>
- Jackson
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.7.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.6.3</version> </dependency>
そもそ もの 発生理由 (推測)
何故、
1.処理の 流れ
以下のような
1-1. YouTube Data API で 検索、 戻り値 の List<searchresult >
を 取得
YouTube Data API で
1-2. SearchResult を Jackson を 使用して、Map<string, object>
に 変換
ObjectMapper を
/** * convertValue * * @param <T> * @param object * @param clazz * @return */ public static Map<String, Object> convertValue(Object object) { ObjectMapper objectMapper = new ObjectMapper(); T result = objectMapper.convertValue(object, Map.class); return result; }
1-3. MongoDriver で、 2 で 変換生成した Map を MongoDB に insert
Map を
2.SearchResult の どこに、 DateTime が 存在するか?
3.MongoDriver は Codec 登録されていない Object の 処理は できない。
基本的な
しかし 末端の
SearchResult は、
mongo-java-driver/bson/src/main/org/bson/codecs at master · mongodb/mongo-java-driver
に
4.うまく 動かす 方法
修正の
1.ObjectMapper で
2.解釈できない
今回は2.
の
Codec クラスを 作成 と 登録
1. Codec クラスを 作成する
以下の
String 型へのDateTime#parseRfc3339()
、DateTime#toStringRfc3339()
が
- GoogleDateTimeCodec.java
import com.google.api.client.util.DateTime; import org.bson.BsonReader; import org.bson.BsonWriter; import org.bson.codecs.Codec; import org.bson.codecs.DecoderContext; import org.bson.codecs.EncoderContext; /** * GoogleDateTimeCodec */ public class GoogleDateTimeCodec implements Codec<DateTime> { @Override public DateTime decode(BsonReader reader, DecoderContext decoderContext) { String date = reader.readString(); return DateTime.parseRfc3339(date); } @Override public void encode(BsonWriter writer, DateTime value, EncoderContext encoderContext) { writer.writeString(value.toStringRfc3339()); } @Override public Class<DateTime> getEncoderClass() { return DateTime.class; } }
2. Codecクラスの 登録
Guice の
MongoClient の
MongoDB に
末端フィールドではない
- MongoDatabaseProvider.java
import com.google.inject.Provider; import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.ServerAddress; import com.mongodb.client.MongoDatabase; import org.bson.codecs.configuration.CodecRegistries; import org.bson.codecs.configuration.CodecRegistry; import xyz.monotalk.festivals4partypeople.models.mongo.codec.GoogleDateTimeCodec; import java.util.Locale; import java.util.ResourceBundle; /** * MongoDatabaseProvider * * @author Kem */ public class MongoDatabaseProvider implements Provider<MongoDatabase> { private static final ResourceBundle RB = ResourceBundle.getBundle("mongoDb", Locale.JAPAN); @Override public MongoDatabase get() { // New ServerAddress ServerAddress serverAddress = newServerAddress(); // New MongoClientOptions MongoClientOptions options = newMongoClientOptions(); MongoClient client = new MongoClient(serverAddress, options); // New Database String databaseName = RB.getString("databaseName"); MongoDatabase mongoDatabase = client.getDatabase(databaseName); return mongoDatabase; } /** * newServerAddress * * @return */ private ServerAddress newServerAddress() { String host = RB.getString("host"); int port = Integer.valueOf(RB.getString("port")); ServerAddress serverAddress = new ServerAddress(host, port); return serverAddress; } /** * newMongoClientOptions * * @return */ private MongoClientOptions newMongoClientOptions() { CodecRegistry codecRegistry = CodecRegistries.fromRegistries( CodecRegistries.fromCodecs(new GoogleDateTimeCodec()), MongoClient.getDefaultCodecRegistry()); return MongoClientOptions.builder() .codecRegistry(codecRegistry).build(); } }
以上です。
コメント