teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

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

2015/11/12 11:24

投稿

eripong
eripong

スコア1546

answer CHANGED
@@ -124,4 +124,13 @@
124
124
  } finally {
125
125
  httpTransport.shutdown();
126
126
  }
127
+ ```
128
+
129
+ 動作確認に使ったjarは、以下の通りです。
130
+ ```
131
+ commons-logging-1.1.1.jar
132
+ google-http-client-1.20.0.jar
133
+ google-http-client-jackson-1.20.0.jar
134
+ lombok.jar
135
+ jackson-core-asl-1.9.11.jar
127
136
  ```

3

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

2015/11/12 11:24

投稿

eripong
eripong

スコア1546

answer CHANGED
@@ -99,4 +99,29 @@
99
99
  at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:763)
100
100
  ... 9 more
101
101
  -(略)-
102
+ ```
103
+ ### [追記]実際にリクエストからパースする場合
104
+ 以下のコードで、実際にHTTPリクエストを送って結果をパースすることができました。
105
+ 変更点は、
106
+ 1.Factoryを使って`JsonObjectParser`を追加した。
107
+ 2`.asInstagramObject(res.parseAsString())`していたのを、`parseAs(クラスA.class)`に変更した。
108
+ 3.動作確認のために`instagramData.getInstagramImageData();`を追加した。
109
+
110
+ ```lang-java
111
+ try {
112
+ HttpRequestFactory requestFactory = httpTransport.createRequestFactory();
113
+ GenericUrl genericUrl = new GenericUrl(url);
114
+ HttpRequest req = requestFactory.buildGetRequest(genericUrl);
115
+ req.setParser(new JacksonFactory().createJsonObjectParser()); // 1.追加
116
+ HttpResponse res = req.execute();
117
+
118
+ try {
119
+ instagramData = res.parseAs(クラスA.class); // 2.変更
120
+ instagramData.getInstagramImageData(); // 3.動作確認のために追加
121
+ } finally {
122
+ res.disconnect();
123
+ }
124
+ } finally {
125
+ httpTransport.shutdown();
126
+ }
102
127
  ```

2

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

2015/11/12 11:13

投稿

eripong
eripong

スコア1546

answer CHANGED
@@ -77,4 +77,26 @@
77
77
  }
78
78
  ]
79
79
  }
80
+ ```
81
+
82
+ ###推測される原因
83
+ おそらく、ライブラリ側からパース時に`DataBreakdown`などのインスタンスをnewするために、
84
+ ライブラリからアクセス可能なデフォルトコンストラクタが必要なことが原因です。
85
+ `public static`を付けない場合に、以下のような例外が発生したためです。
86
+ 試してはいませんが、内部クラスをやめて、publicなクラスにしても成功すると思います。
87
+ ```
88
+ Exception in thread "main" java.lang.IllegalArgumentException:
89
+ at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:880)
90
+ at com.google.api.client.json.JsonParser.parse(JsonParser.java:381)
91
+ at com.google.api.client.json.JsonParser.parse(JsonParser.java:354)
92
+ at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:98)
93
+ at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:92)
94
+ at sandbox.httpclient.クラスA.main(クラスA.java:46)
95
+ -(略)-
96
+ 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
97
+ at com.google.api.client.util.Types.handleExceptionForNewInstance(Types.java:165)
98
+ at com.google.api.client.util.Types.newInstance(Types.java:120)
99
+ at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:763)
100
+ ... 9 more
101
+ -(略)-
80
102
  ```

1

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

2015/11/12 07:14

投稿

eripong
eripong

スコア1546

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