0

私はSpring 3.1.1をOXMのものと一緒に使用しており、RestTemplateを使用してリクエストを別のサーバーに投稿しています。これのリクエスト側とレスポンス側の両方として ClassTermCollection というクラスを使用しています。これには @XmlRootElement などの注釈が付けられており、今日まで問題なく動作しています。しかし、JAXB がリクエストを作成しようとすると、突然次のエラーが発生します (つまり、このエラーは、サーバーへの http 呼び出しが行われる前に、クライアント側でスローされます)。

Google は、この特定のエラーについてほとんど役に立たないことを明らかにしており、さらに悪いことに、Sun は、JDK を使用して、例外がスローされているクラスにソースを出荷していないようです...そのため、完全にデバッグすることさえできません。何が起こっているのかを正確に特定するために、これの根元まで。

編集:(スタックトレースの下の追加コメントを参照)

[エラー] org.springframework.http.converter.HttpMessageNotWritableException: [pmt.model.collections.ClassTermCollection@6576fac] を書き込めませんでした。ネストされた例外は org.springframework.oxm.MarshallingFailureException: JAXB marshalling exception; です。ネストされた例外は javax.xml.bind.MarshalException: unsupported javax.xml.parser.transform.Result パラメータ [ERROR] at org.springframework.http.converter.xml.MarshallingHttpMessageConverter.writeToResult(MarshallingHttpMessageConverter.java:134) [ERROR] at org.springframework.http.converter.xml.MarshallingHttpMessageConverter.writeToResult(MarshallingHttpMessageConverter.java:134) org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.writeInternal(AbstractXmlHttpMessageConverter.java:66) [エラー] org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:179) [エラー] at org.springframework. web.client. HttpConnection.handleRequest(HttpConnection.java:505) [エラー] org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843) で [エラー] org.mortbay.jetty.HttpParser.parseNext(HttpParser.java: 647) [エラー] org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205) で [エラー] org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) で [エラー] org.mortbay で。 io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) [エラー] org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) で [エラー] 原因: org.springframework.oxm.MarshallingFailureException: JAXB マーシャリング例外。ネストされた例外は javax.xml.bind.MarshalException: unsupported javax.xml.parser.transform.Result parameter [ERROR] at org.springframework.oxm.jaxb です。

わかりました。com.sun.xml.internal.bind.v2.runtime.MarshallerImplのソース1をオンラインで見つけました。今、何が起こっているのか (ちょっと) わかります。そのコードは Result インスタンスを見て、それが StreamResult の場合 (私の場合のように)、StreamResult の outputstream、writer、次に systemId フィールドを逆参照しようとし、それらの値を使用して Writer を構築します。それらのすべてが null の場合、メソッドの下部に落ちて、ここで発生している「サポートされていない形式」の例外がスローされます。

その上で、Spring org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter クラスで、StreamResult を構築するこの行に到達し、outputMessage.getBody() の結果を StreamResult コンストラクターに渡します。ここで null になっているため、下から問題が発生しています。

@Override protected final void writeInternal(T t, HttpOutputMessage outputMessage) throws IOException { writeToResult(t, outputMessage.getHeaders(), new StreamResult(outputMessage.getBody())); }

解決済み

これでうまくいきました...結果の詳細はすべて忘れてしまいました。しかし、それは基本的に、同僚が HttpClient クラスの 1 つをサブクラス化するコードを追加し、彼のクラスがインターフェイスの契約を正確に満たしていないというクレイジーな状況であり、私のコードによって呼び出されたときにこのエラーが発生しました。これは、JAXB エラーのように見える奇妙な状況の 1 つでしたが、JAXB とはまったく関係がないことが判明しました。

4

2 に答える 2

4

問題は、StreamResult をインスタンス化するときに、書き込まれるデータを格納する手段を提供する必要があることです。次のように何かを行う必要があります。

StreamResult res=new StreamResult(new ByteArrayOutputStream());

ByteArrayOutputStream は必要に応じて大きくなります。

于 2012-07-04T20:32:51.660 に答える
1

Looking at Spring's source code, Marshaller complains that it doesn't support the StreamResult object. It definitely supports this object, but what you may be experiencing is a classloading issue where a StreamResult loaded from the wrong JAR, or by the wrong classloader, is being used.

于 2012-05-03T08:32:51.103 に答える