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

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

ただいまの
回答率

88.60%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,423
退会済みユーザー

退会済みユーザー

現在、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)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

おそらく依存関係で実行時に必要なライブラリー(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 18:05

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

    キャンセル

  • 2016/08/08 19:41

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

    キャンセル

  • 2016/08/08 19:55

    to A-pZさん

    確認していただきありがとうございます。

    ランタイムでの間接的な依存関係解決を手動で行って上手く行かないのはハマりどころですね。
    過去の質問にもビルドツールを使わず動かないで困っているケースがいくつかありました。

    今回はMavenを使っているものと決めてかかってしまったので気づくのが遅れてしまいましたが...

    キャンセル

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

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る