2

わかりました、私はこれに対する答えをどこでも探しました。それは私を夢中にさせています。

私がする必要があるのは、非常に単純な Web サービスの応答を非整列化することだけです。唯一の問題は、生成されたソース ファイルを@XmlRootElement注釈なしで使用していることです。この生成されたソース ファイルを編集して追加することもできません@XmlRootElement。「そのまま」使うしかない。

これは私が持っている現在のコードですが、この投稿の下部に示されているエラーが発生しています。JAXBElementラッパーを使用しようとしましたが、役に立ちませんでした。誰かが私に必要なコードを教えてくれませんか? 使い方"QName"sなどはわかりません。

以下のこのコードは、以下を持つクラスでうまく機能します@XmlRootElement

 MyGeneratedClass response = restTemplate.getForObject("url to webservice!"),
     MyGeneratedClass.class);

 return response

悲しいことに、この場合、このエラーが発生しています。REST 応答を非整列化するのを手伝ってください!

 Could not extract response: no suitable HttpMessageConverter found for response
    type [MyGeneratedClass] and content type [application/xml;version=1]
4

3 に答える 3

3

何ヶ月も前にこれを投稿するのを忘れていたので、おそらく解決策をフォローアップする必要があります. このソリューションでは、リクエスト ヘッダーに Cookie も追加されますが、これは無視できます。生成されたソース ファイルに @XmlRootElement アノテーションがない場合は、次のように非整列化できます。

// Cookie setting
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("Cookie", "myCookie=value");
HttpEntity<?> requestEntity = new HttpEntity(requestHeaders);

HttpEntity<String> response = restTemplate.exchange("web service url"), 
    HttpMethod.GET, requestEntity, String.class);

// Unmarshalling
JAXBElement<MyGeneratedClass> result = 
    (JAXBElement<MyGeneratedClass>) unmarshaller.unmarshal(
        new StreamSource(new ByteArrayInputStream(response.getBody().getBytes())));

return result.getValue();
于 2012-10-12T10:38:35.273 に答える
1

Spring の RestTemplate は、オブジェクトを XML に非整列化するためにHttpMessageConverterに依存しています。より具体的にはJaxb2RootElementHttpMessageConverter.canWrite、表示されているエラーの原因はメソッドにあります。XmlRootElement アノテーションが存在するかどうかを気にしないように canWrite メソッドをオーバーライドしたとしても、JAXB はオブジェクトを非整列化できません。

この制限を回避する 1 つの方法は、Jaxb2RootElementHttpMessageConverter.canWrite をオーバーライドして、XmlRootElement アノテーションの存在をチェックせず、マッピング ファイルで EclipseLink のMoxy JAXB 実装を使用することです。マッピング ファイルでは、XmlRootElement アノテーションに相当するものを指定できるため、Java クラスでアノテーションを使用せずに JAXB を使用できます。

于 2012-07-31T13:20:50.547 に答える