回答編集履歴
4
動作に必要だったjarを追記した。
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
実際にリクエストを実行するコードを追記した。
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
原因の推測について追記した。
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を削除したことを追記した。
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;
|