2012-05-03 12 views
0

私は、RestTemplateを使用して別のサーバにリクエストを送信する、OXMのものとともにSpring 3.1.1を使用しています。私はClassTermCollectionというクラスをリクエスト側とレスポンス側の両方に使用しています。@ XmlRootElementなどで注釈が付けられており、今日までこれまでうまくいきました。しかし、JAXBが要求を作成しようとしているときに突然、次のエラーが発生しています(つまり、このエラーはサーバーへのhttp呼び出しが行われる前にクライアント側でスローされます)。(解決済み)「サポートされていないjavax.xml.parser.transform.Resultパラメータ」を使用したJAXBマーシャリングの失敗

Googleは、この特定のエラーについて何も役に立たないことを明らかにしています。さらに悪いことに、Sunは明らかに、例外がスローされているクラスにソースを配布しません。何が起こっているのかを正確に特定するために、このルートの根源に至るまで

アイデア?

編集:(スタックトレースの下に追加のコメントを参照してください)

[ERROR] org.springframework.http.converter.HttpMessageNotWritableException:[ [email protected]]書き込めませんでした。ネストされた例外はorg.springframework.oxm.MarshallingFailureException:JAXBマーシャリング例外です。ネストされた例外はjavax.xml.bind.MarshalExceptionです:サポートされていないjavax.xml.parser.transform.Resultパラメータ [ERROR] at org.springframework.http.converter.xml.MarshallingHttpMessageConverter.writeToResult(MarshallingHttpMessageConverter.java:134) [ERROR ] [エラー] org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.writeInternal(AbstractXmlHttpMessageConverter.java:66) [ERROR] at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:179) [エラー] org.springframework.web.client.RestTemplate $ HttpEntityRequestCallback.doWithRequest(RestTemplate.java:588) [ERROR] at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:436) [ERROR] at org。 springframework.web.client.RestTemplate.execute(RestTemplate.java:409) [ERROR] at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:287) [ERROR] at com.pmt.fe.server.InvestmentServiceImpl.saveTerms(InvestmentServiceImpl.java:306) [エラー] sun.reflect.NativeMethodAccessorImpl.invokeでsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) [ERROR] sun.reflect.DelegatingMethodAccessorImpl.invokeで(NativeMethodAccessorImpl.java:57) [ERROR](DelegatingMethodAccessorImpl.java:43)で java.lang.reflect.Method.invoke(Method.java:601)の[ERROR] [エラー] com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) [ ERROR] com.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:551) [エラー] com.pmt.fe.se rer.ServiceDispatcher.invokeAndEncodeResponse(RemoteServiceDispatcher.java:115) [エラー] com.pmt.fe.server.RemoteServiceDispatcher.processCall(RemoteServiceDispatcher.java:75) [エラー] com.google.gwt.user.serverで。 rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)の[ERROR] [ERROR] at javax.servlet.http。 org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolderでjavax.servlet.http.HttpServlet.service(HttpServlet.java:717) [ERROR]でHttpServlet.service(HttpServlet.java:637) [ERROR]。 java:487) [ERROR] at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) [ERROR] at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) [ERROR] at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler。java:181) [ERROR] at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729) [ERROR] at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) [ERROR] at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) [ERROR] at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49) [エラー] org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) [ERROR] at org.mortbay.jetty.Server.handle(Server.java:324) [ERROR] at org.mortbay.jetty .HttpConnection.handleRequest(HttpConnection.java:505) [ERROR] at org.mortbay.jetty.HttpConnection $ RequestHandler.content(HttpConnection.java:843) [ERROR] at org.mortbay.jett y.HttpParser.parseNext(HttpParser.java:647) [ERROR] at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205) [ERROR] at org.mortbay.jetty.HttpConnection.handle(HttpParser.java:647) java:380) [ERROR] at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) [ERROR] at org.mortbay.thread.QueuedThreadPool $ PoolThread.run(QueuedThreadPool.java:488) [エラー]発生原因:org.springframework.oxm.MarshallingFailureException:JAXBマーシャリング例外。ネストされた例外はjavax.xml.bind.MarshalException:サポートされていないjavax.xml.parser.transform.Resultパラメータ [ERROR] at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:758) [ERROR] at org.springframeworkでorg.springframework.oxm.jaxb.Jaxb2Marshaller.marshalでorg.springframework.oxm.jaxb.Jaxb2Marshaller.marshal(Jaxb2Marshaller.java:597) [ERROR](Jaxb2Marshaller.java:580) [ERROR]。 [エラー]原因:javax.xml.bind.MarshalException:サポートされていないjavax.xml.parser.transform.Result(エラーが発生した場合)パラメータ [ERROR] com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.createXmlOutput(MarshallerImpl.java:221) [ERROR] at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:236) [ERROR] at org.springframework.oxm.jaxb.Jaxb2Marshaller.marshal(Jaxb2Marshaller.java: 593) [ERROR] ... 38もっと

OKは、オンライン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を構築し、StreamResultコンストラクタにoutputMessage.getBody()の結果を渡すこの行を取得します。私はここでヌルになっているので、問題は下から泡立ちます。

@Override 保護最終ボイドwriteInternalは(T T、HttpOutputMessage outputMessage)にIOException { writeToResult(T、outputMessage.getHeaders()、新しいするStreamResult(outputMessage.getBody()))スロー。 }

編集:これはうまくいきました...申し訳ありませんが、私はこれを更新するのにずっとかかりましたが、仕事に気を取られました。とにかく、私はそれが何になったのかをすべて忘れてしまった。基本的には、同僚がHttpClientクラスのサブクラス化されたコードを追加し、彼のクラスがインターフェイスの契約を正確に満たさず、コードで呼び出されたときに、このエラーが発生しました。それはJAXBエラーのように見える奇妙な状況の1つでしたが、JAXBとまったく関係がないことが判明しました。

+0

「書き込みできませんでした」とは何ですか?あなたのログに何か問題があります – GingerHead

+0

JDKのどこにエラーが発生しているのかわからないので、スタックトレースを切り捨てました。 – artbristol

+0

@Haarutは[[email protected]]と書くことができませんでした。 –

答えて

1

Springのソースコードを見ると、MarshallerはStreamResultオブジェクトをサポートしていないと不平を言っています。これは間違いなくこのオブジェクトをサポートしていますが、間違ったJARまたは間違ったクラスローダーによってロードされたStreamResultが使用されているクラスローディングの問題が発生する可能性があります。

2

あなたの問題は、StreamResultをインスタンス化する際に、書き込まれるデータを格納する手段を提供する必要があることです。

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

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

関連する問題