2016-07-18 4 views
2

私はこれに対して私の頭を今や叩いていますが、まだ喜びはありません。私は春の初心者ですし、本当に助けてもらえます。Spring MVC:START_ARRAYトークンのインスタンスを逆シリアル化できません。

DBテーブルからコードのリストを返すためにSpringブートを使用しようとしています。私は、ブラウザでURLから私のRESTコントローラ...

例URLを呼び出すとき:はlocalhost:8081 /シス/ UTL/lookupchoice/OS/

それはこの返します

[ 
{"lookupId":10,"choiceGroup":"O.s","choiceCode":null,"displayLabel":"Pending","hidden":false,"displayOrder":1}, 
{"lookupId":11,"choiceGroup":"O.s","choiceCode":null,"displayLabel":"Active","hidden":false,"displayOrder":2}, 
{"lookupId":12,"choiceGroup":"O.s","choiceCode":null,"displayLabel":"Archived","hidden":false,"displayOrder":3}, 
{"lookupId":13,"choiceGroup":"O.s","choiceCode":null,"displayLabel":"Placeholder","hidden":false,"displayOrder":4} 
] 

しかし、これをクライアントコントローラから実行しようとすると、エラーメッセージが表示されます。呼び出しは次のようになります。

// 
//Compiles but does not work 
LookupChoice lookupChoice = restTemplate.getForObject(REST_URI+"/utl/lookupchoice/O.s/", 
     LookupChoice.class); 

エラー:ネストされた例外はcom.fasterxml.jackson.databind.JsonMappingExceptionです:

トークンSTART_ARRAYのうち、com.MyPakage.repository.LookupChoiceのインスタンスをデシリアライズすることはできません

誤差を仮定すると、配列ではなく、単一のオブジェクトで返されるために発生し、私はこれにコードを変更:

// 
//Does not compile 
Iterable<LookupChoice> lookupChoice = restTemplate.getForObject(REST_URI+"/utl/lookupchoice/U.r/", 
     Iterable<LookupChoice.class>); 

しかし、今GE Intellijのエラーです。 反復処理可能 < LookupChoice.class>のparamのために、「式はを期待」ことを示しています、と私はこれを乗り越えることができません。

は、あなたの時間と支援のためにご返信用 エド

感謝、ありがとうございました。私はこれを選択し、それはすべて今働くようです。ご協力いただきありがとうございます!

RestTemplate restTemplate = new RestTemplate(); 
ResponseEntity<Object[]> responseEntity; 
Object[] lookupChoice; 

responseEntity = restTemplate.getForEntity(REST_SERVICE_URI+"/utl/lookupchoice/O.s/" , Object[].class); 
lookupChoice = responseEntity.getBody(); 
model.addAttribute("Status", lookupChoice); 
+0

上記については、これをよりエレガントにする、および/またはパフォーマンスを改善するような調整がありますか? – eLowe

答えて

3

それは、彼らが実行時に存在しないため、ジェネリック型パラメータのクラスを渡すためにJavaでは不可能なので、それはコンパイルできない理由があります。

あなたはここに2つのオプションがあり、どちらかの配列(LookupChoice[])を使用してList<LookupChoice>、必要な場合にそれを変換しますParameterizedTypeReference

restTemplate.getForObject(url, LookupChoice[]); 

それとも、使用することができます。

restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<LookupChoice>>() {}).getBody() 

それはあります上のコード例のようにサブクラス化するか、匿名クラスを使用してください。

また、私は間違っていない場合は、ParameterizedTypeReferenceにのみexchange()方法で動作しますので、あなたはgetBody()メソッドを使用する必要がありますので、あなたは、あなたの生のオブジェクトの代わりにResponseEntityを取得します。

関連する問題