2012-05-03 36 views
0

我正在使用Spring 3.1.1及其OXM內容,使用RestTemplate將請求發佈到其他服務器。我使用一個名爲ClassTermCollection的類作爲這個的請求和響應端,並且用@XmlRootElement等來註釋,並且直到今天一直工作得很好。但是,當JAXB嘗試創建請求時(也就是說,在服務器的http調用發生之前,在客戶端引發此錯誤),我們突然發現以下錯誤。(已解決)JAXB編組失敗並顯示「不支持的javax.xml.parser.transform.Result參數」

Google對這個特定的錯誤幾乎沒有任何用處,甚至更糟糕的是,Sun顯然沒有將源代碼發佈到引發異常的類,使用JDK ...所以我甚至不能調試一直到這個的根源才能確切地確定發生了什麼。

任何想法?

編輯:(見下文堆棧跟蹤附加評論)

[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 ] at org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.writeInternal(AbstractXmlHttpMessageConverter.java:66) [ERROR] at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:179) [ERROR] at org.springframework.web.client.RestTemplate $ HttpEntityRequestCallback.doWithRequest(RestTemplate.java:588) [ERROR]在org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:436) [ERROR]在有機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) [ERROR]在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) [ERROR]在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [ERROR]在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [ERROR] at java.lang.reflect.Method.invoke(Method.java:601) [ERROR] at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) [錯誤]在com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:551) [錯誤] at com.pmt.fe.se rver.RemoteServiceDispatcher.invokeAndEncodeResponse(RemoteServiceDispatcher.java:115) com.pmt.fe.server.RemoteServiceDispatcher.processCall(RemoteServiceDispatcher.java:75)上的[ERROR] com.google.gwt.user.server上的[ERROR]。 rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) [ERROR] at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) [ERROR] at javax.servlet.http。 HttpServlet.service(HttpServlet.java:637) [錯誤]在javax.servlet.http.HttpServlet.service(HttpServlet.java:717) [錯誤]在org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder。 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) [ERROR] at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) [org.mortbay.jetty.Server.handle(Server.java:324)[ERROR] [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]在org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205) [ERROR]在org.mortbay.jetty.HttpConnection.handle(HttpConnection的。 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.oxm.jaxb.Jaxb2Marshaller.marshal(Jaxb2Marshaller.java:597) [ERROR] at org.springframework.oxm.jaxb.Jaxb2Marshaller.marshal(Jaxb2Marshaller.java:580) [ERROR] at org.springframework。 http.converter.xml.MarshallingHttpMessageConverter.writeToResult(MarshallingHttpMessageConverter.java:131) [錯誤] ... 36更多 [錯誤]引起:javax.xml.bind.MarshalException:不受支持的javax.xml.parser.transform.Result參數 [錯誤] at 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) [錯誤] ... 38多個

OK,找到源1爲com.sun.xml.internal.bind.v2.runtime.MarshallerImpl網上,現在我看到(在某種程度上)是什麼發生。該代碼查看Result實例,如果它是StreamResult(就像我的情況那樣),它會嘗試解引用StreamResult的輸出流,writer和systemId字段,並使用這些值構造一個Writer。如果它們全部爲空,它會進入方法的底部,並拋出「不支持的格式」異常,這是發生在這裏。

除此之外,在Spring的org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter類中,我們找到了這一行,它構造了StreamResult,並將outputMessage.getBody()的結果傳遞給StreamResult構造函數。我在這裏變得空了,因此從下面冒出來的問題。

@覆蓋 保護最終空隙writeInternal(T T,HttpOutputMessage outputMessage)拋出IOException異常{ writeToResult(T,outputMessage.getHeaders(),新StreamResult(outputMessage.getBody())); }

編輯:得到這個工作...對不起,我花了這麼長的時間來更新這個,但我的工作分心。無論如何,我忘記了結果的所有細節;但它基本上是一個瘋狂的情況,其中一個同事添加了一些代碼,將一個HttpClient類中的一個子類化,並且他的類沒有完全滿足該接口的合約,並且在被代碼我的代碼調用時,它導致了此錯誤。這是那些看起來像JAXB錯誤的奇怪情況之一,但事實證明它與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將根據需要增長。

相關問題