質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Q&A

解決済

1回答

5590閲覧

jarseyでjsonをPOJOにパースできない

退会済みユーザー

退会済みユーザー

総合スコア0

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

1グッド

0クリップ

投稿2016/08/08 03:02

編集2016/08/08 06:43

現在、pure javaを使ってREST/Jsonで通信するプログラムを作っているのですが、
responseをPOJOに格納しようとして失敗しています。
(jarsey1.19.1を使用しています。)
sendRequestメソッド内を

TestDto testDto=response.getEntity(TestDto.class);

と書きたいのですが、ClientHandlerExceptionが出てしまいます。
色々と調べてはみたのですが、解決に至らなかったので
お知恵を拝借できないでしょうか。

import java.net.URI; import java.net.URISyntaxException; import java.util.HashMap; import javax.ws.rs.core.MediaType; import net.arnx.jsonic.JSON; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientRequest; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.json.JSONConfiguration; public class RestClient { public String getString(String url, MediaType type) { Client client = getClient(); WebResource resource = client.resource(url); ClientResponse response = resource.accept(type).get(ClientResponse.class); switch (response.getStatus()) { case 200 : // OK break; default: return String.format("Code:%s Entity:%s", response.getStatus(), response.getEntity(String.class)); } return response.getEntity(String.class); } public Client getClient() { ClientConfig config = new DefaultClientConfig(); config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); Client client = Client.create(config); return client; } @SuppressWarnings("finally") public Object sendRequest(String uri,String method,Object entity){ RestClient restClient=new RestClient(); Client client=restClient.getClient(); ClientRequest.Builder builder=ClientRequest.create(); builder.type(MediaType.APPLICATION_JSON_TYPE).entity(JSON.encode(entity)); ClientRequest request; Object json = null; try { request = builder.build(new URI(uri), method); ClientResponse response=client.handle(request); String str=response.getEntity(String.class); json=JSON.decode(str); } catch (URISyntaxException e) { e.printStackTrace(); }finally{ return json; } } }
import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class TestDto { public String detailCode; public String telNumber; public TestDto(){ } public TestDto(String detailCode,String telNumber){ this.detailCode=detailCode; this.telNumber=telNumber; } } import java.util.HashMap; import java.util.Map; public class RestTest { public static void main(String[] args) throws URISyntaxException{ String uri=""; Map<String, String> entity=new HashMap<String, String>(); entity.put("serviceKubun", "1"); entity.put("telNumber", "0312345678"); entity.put("systemidentifier", "ABC"); Map<String,Map<String,String>> parent = new HashMap<String,Map<String,String>>(); parent.put("request", entity); String method="POST"; RestClient client=new RestClient(); Object json=client.sendRequest(uri, method, parent); } }

エラーログ

重大: A message body reader for Java class *******.rest.TestDto, and Java type class ********.rest.TestDto, and MIME media type application/json; charset=utf-8 was not found [月 8 08 13:26:17 JST 2016] 重大: The registered message body readers compatible with the MIME media type are: application/json; charset=utf-8 -> com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App */* -> com.sun.jersey.core.impl.provider.entity.FormProvider com.sun.jersey.core.impl.provider.entity.StringProvider com.sun.jersey.core.impl.provider.entity.ByteArrayProvider com.sun.jersey.core.impl.provider.entity.FileProvider com.sun.jersey.core.impl.provider.entity.InputStreamProvider com.sun.jersey.core.impl.provider.entity.DataSourceProvider com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General com.sun.jersey.core.impl.provider.entity.ReaderProvider com.sun.jersey.core.impl.provider.entity.DocumentProvider com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General com.sun.jersey.core.impl.provider.entity.EntityHolderReader com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General [月 8 08 13:26:17 JST 2016] com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class ***.rest.TestDto, and Java type class *****.rest.TestDto, and MIME media type application/json; charset=utf-8 was not found at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:630) at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:586) at ***.rest.RestClient.sendRequest(RestClient.java:54) at ***.rest.RestTest.main(RestTest.java:28)
A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

※以下、クローズ後のまとめです。

おそらく依存関係で実行時に必要なライブラリー(Jarファイル)が足りないためにjersey-jsonが有効にできず、JSONConfiguration.FEATURE_POJO_MAPPINGという設定をオンにしないのと同様のエラーが出ているものと思われます。

ビルドツールを使えば避けられる問題です。
可能であれば、ビルドツールを使用しましょう。

詳しくは、コメント欄を参照してください。


(最初の回答)

動作確認はしていませんが、JSONConfiguration.FEATURE_POJO_MAPPINGという設定をオン(true)にする必要があるようです。

Chapter 5. JSON Support - Jersey 1.19.1 User Guide
https://jersey.java.net/documentation/1.19.1/json.html#json.pojo.approach.section

JavaでRESTクライアントを作成する【第三回】 : アジャイル株式会社
https://www.agilegroup.co.jp/technote/java-rest-client03.html

投稿2016/08/08 03:52

編集2016/08/08 09:12
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/08 04:08

回答ありがとうございます。 上記リンクを参考にして作成していますが、 ``` config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); ``` の箇所でtrueになっているはずです。
argius

2016/08/08 04:18

あ、そこは気づきませんでした。すみません。 ClientHandlerExceptionが出ているメッセージの行をすべて掲載していただくことはできますか。 スタックトレースは要りません。
argius

2016/08/08 05:37

質問とは直接関係ありませんが、finally句にreturnを書くのは問題があります。 下記の記事などを参考にしてください。 finally句におけるreturnの問題 - 中継地点 http://d.hatena.ne.jp/h_mori/20080707/1215433879 本題ですが、 エラーの掲載、ありがとうございました。 やはりconfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);が 正しく機能していれば問題ないはずです。 実際に動作させてみました。 JSONやTestDTOの詳細が分からないので確実なことでは無いですが、 それ以外は同じコードで正しく動作しました。 FEATURE_POJO_MAPPING=trueを設定しない場合は、同じエラーが出ました。 最新のコードがコンパイルがされていない可能性などは無いでしょうか。
退会済みユーザー

退会済みユーザー

2016/08/08 06:29

eclipseの再起動やプロジェクトのクリーンなどを試してみました。 あと、jersey-jsonを入れるのを忘れていたのでjarを追加し、ビルドパスも通しました。 ですが、状況は変わりません。
argius

2016/08/08 07:55

調べていたら、私の環境でも同じコードで同じ問題が発生するようになって、戻らなくなりました。 思ったよりやっかいそうですね... すみません、ちょっと時間がかかりそうです。
argius

2016/08/08 08:33

問題が出ていたのはWebサービス側でした... 依存関係ですが、jerseyは同じバージョンになっていますか? 下記以外の関係しそうな依存設定はありますか? jersey-client:1.19.1 jersey-json:1.19.1 jsonic:1.3.10 私はこれだけで正常に動作できています。
退会済みユーザー

退会済みユーザー

2016/08/08 08:52

回答ありがとうございます。 jsonicは1.3.7ですが、pom.xmlがないpure javaなので ライブラリ(jar)が色々と不足していたようです。 最終的にjackson関係のライブラリを入れたところ、 まだ実行時エラーは残っていますが、 jsonとDtoの形が合ってないという指摘のようなのでこのまま進めてみます。 ありがとうございました。
argius

2016/08/08 09:05

依存設定は3つだけですが、さらにそれらの依存を含めると、全部でJarファイルは14個になっています。 別のMavenプロジェクトを作って、どのJarが必要なのかを確認してみたほうが良いかもしれませんね。
A-pZ

2016/08/08 10:41

依存関係すこしありましたね確かに(ω・ mavenを使って作成したプロジェクトであれば確かに問題は発生せず動作できました。
argius

2016/08/08 10:55

to A-pZさん 確認していただきありがとうございます。 ランタイムでの間接的な依存関係解決を手動で行って上手く行かないのはハマりどころですね。 過去の質問にもビルドツールを使わず動かないで困っているケースがいくつかありました。 今回はMavenを使っているものと決めてかかってしまったので気づくのが遅れてしまいましたが...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問