回答編集履歴

4

動作に必要だったjarを追記した。

2015/11/12 11:24

投稿

eripong
eripong

スコア1546

test CHANGED
@@ -251,3 +251,21 @@
251
251
  }
252
252
 
253
253
  ```
254
+
255
+
256
+
257
+ 動作確認に使ったjarは、以下の通りです。
258
+
259
+ ```
260
+
261
+ commons-logging-1.1.1.jar
262
+
263
+ google-http-client-1.20.0.jar
264
+
265
+ google-http-client-jackson-1.20.0.jar
266
+
267
+ lombok.jar
268
+
269
+ jackson-core-asl-1.9.11.jar
270
+
271
+ ```

3

実際にリクエストを実行するコードを追記した。

2015/11/12 11:24

投稿

eripong
eripong

スコア1546

test CHANGED
@@ -201,3 +201,53 @@
201
201
  -(略)-
202
202
 
203
203
  ```
204
+
205
+ ### [追記]実際にリクエストからパースする場合
206
+
207
+ 以下のコードで、実際にHTTPリクエストを送って結果をパースすることができました。
208
+
209
+ 変更点は、
210
+
211
+ 1.Factoryを使って`JsonObjectParser`を追加した。
212
+
213
+ 2`.asInstagramObject(res.parseAsString())`していたのを、`parseAs(クラスA.class)`に変更した。
214
+
215
+ 3.動作確認のために`instagramData.getInstagramImageData();`を追加した。
216
+
217
+
218
+
219
+ ```lang-java
220
+
221
+ try {
222
+
223
+ HttpRequestFactory requestFactory = httpTransport.createRequestFactory();
224
+
225
+ GenericUrl genericUrl = new GenericUrl(url);
226
+
227
+ HttpRequest req = requestFactory.buildGetRequest(genericUrl);
228
+
229
+ req.setParser(new JacksonFactory().createJsonObjectParser()); // 1.追加
230
+
231
+ HttpResponse res = req.execute();
232
+
233
+
234
+
235
+ try {
236
+
237
+ instagramData = res.parseAs(クラスA.class); // 2.変更
238
+
239
+ instagramData.getInstagramImageData(); // 3.動作確認のために追加
240
+
241
+ } finally {
242
+
243
+ res.disconnect();
244
+
245
+ }
246
+
247
+ } finally {
248
+
249
+ httpTransport.shutdown();
250
+
251
+ }
252
+
253
+ ```

2

原因の推測について追記した。

2015/11/12 11:13

投稿

eripong
eripong

スコア1546

test CHANGED
@@ -157,3 +157,47 @@
157
157
  }
158
158
 
159
159
  ```
160
+
161
+
162
+
163
+ ###推測される原因
164
+
165
+ おそらく、ライブラリ側からパース時に`DataBreakdown`などのインスタンスをnewするために、
166
+
167
+ ライブラリからアクセス可能なデフォルトコンストラクタが必要なことが原因です。
168
+
169
+ `public static`を付けない場合に、以下のような例外が発生したためです。
170
+
171
+ 試してはいませんが、内部クラスをやめて、publicなクラスにしても成功すると思います。
172
+
173
+ ```
174
+
175
+ Exception in thread "main" java.lang.IllegalArgumentException:
176
+
177
+ at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:880)
178
+
179
+ at com.google.api.client.json.JsonParser.parse(JsonParser.java:381)
180
+
181
+ at com.google.api.client.json.JsonParser.parse(JsonParser.java:354)
182
+
183
+ at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:98)
184
+
185
+ at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:92)
186
+
187
+ at sandbox.httpclient.クラスA.main(クラスA.java:46)
188
+
189
+ -(略)-
190
+
191
+ Caused by: java.lang.IllegalArgumentException: unable to create new instance of class sandbox.httpclient.クラスA$DataBreakdown because it is not static and possibly because it is not public
192
+
193
+ at com.google.api.client.util.Types.handleExceptionForNewInstance(Types.java:165)
194
+
195
+ at com.google.api.client.util.Types.newInstance(Types.java:120)
196
+
197
+ at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:763)
198
+
199
+ ... 9 more
200
+
201
+ -(略)-
202
+
203
+ ```

1

@Getterを削除したことを追記した。

2015/11/12 07:14

投稿

eripong
eripong

スコア1546

test CHANGED
@@ -1,4 +1,16 @@
1
1
  [HTTP Client Library for Java](https://developers.google.com/api-client-library/java/google-http-java-client/)の1.20.0で試したところ、以下のコードでうまくいきました。
2
+
3
+
4
+
5
+ 変更点は
6
+
7
+  1.@Getterを削除した。
8
+
9
+  2.自分でFactoryを作った。
10
+
11
+  3.`class DataBreakdown`を`public static class DataBreakdown`に直した。
12
+
13
+ です。
2
14
 
3
15
 
4
16
 
@@ -6,9 +18,7 @@
6
18
 
7
19
  同じ現象は発生しませんでしたが、少なくとも
8
20
 
9
- `class DataBreakdown`を`public static class DataBreakdown`に直さないと、
10
-
11
- 例外が発生して動作しませんでした。
21
+ 3.を実施しないと、例外が発生して動作しませんでした。
12
22
 
13
23
 
14
24