Overview
You are prototyping an interface to a Product Information Management platform that offers REST services but you are unable to do it because sending messages with a PATCH method is not possible. The following error can be seen in the stack trace: 'java.net.ProtocolException: Invalid HTTP method: PATCH'.
Full stack trace:
ID=dev_ESBTest (warning) [] Interceptor for {http://www.aurea.com/custom/RESTService}WebClient has thrown exception, unwinding noworg.apache.cxf.interceptor.Fault: Could not send Message. at org.apache.cxf.interceptor.MessageSenderInterceptor.handleMessage(MessageSenderInterceptor.java:48) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) at org.apache.cxf.jaxrs.client.AbstractClient.doRunInterceptorChain(AbstractClient.java:635) at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1071) at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:878) at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:852) at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:312) at org.apache.camel.component.cxf.jaxrs.CxfRsProducer.invokeHttpClient(CxfRsProducer.java:155) at org.apache.camel.component.cxf.jaxrs.CxfRsProducer.process(CxfRsProducer.java:87) at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:120) at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:292) at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:115) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:91) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:330) at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:220) at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:303) at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:122) at org.apache.camel.processor.RouteInflightRepositoryProcessor.processNext(RouteInflightRepositoryProcessor.java:48) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:73) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:86) at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:48) at com.progress.sonic.esb.camel.DirectSonicEsbProducer.process(DirectSonicEsbProducer.java:94) at com.progress.sonic.esb.camel.DirectSonicEsbProducer.process(DirectSonicEsbProducer.java:36) at org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:150) at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:117) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:86) at org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:63) at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:360) at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:331) at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:227) at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:331) at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:169) at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:111) at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:97) at com.progress.sonic.esb.service.connect.ConnectService.sendMessage(ConnectService.java:518) at com.progress.sonic.esb.service.connect.ConnectService.service(ConnectService.java:293) at com.sonicsw.xqimpl.service.debug.DebugServiceInterceptor.intercept(DebugServiceInterceptor.java:120) at com.sonicsw.xqimpl.service.XQServiceChain$XQInterceptorServiceWrapper.intercept(XQServiceChain.java:537) at com.sonicsw.xqimpl.service.XQServiceChain$XQInterceptorServiceWrapper.service(XQServiceChain.java:524) at com.sonicsw.xqimpl.service.XQServiceChain.service(XQServiceChain.java:156) at com.sonicsw.xqimpl.service.ServiceMessageHandler.callService(ServiceMessageHandler.java:485) at com.sonicsw.xqimpl.service.ServiceMessageHandler.handleMessageCommon(ServiceMessageHandler.java:255) at com.sonicsw.xqimpl.service.ServiceMessageHandler.handleMessage(ServiceMessageHandler.java:138) at com.sonicsw.xqimpl.service.XQDispatcher.onMessage(XQDispatcher.java:469) at com.sonicsw.esb.itinerary.model.EsbStepNode.doExecute(EsbStepNode.java:310) at com.sonicsw.esb.itinerary.model.EsbStepNode.execute(EsbStepNode.java:185) at com.sonicsw.esb.process.model.impl.DefaultActivityNode.offerIncoming(DefaultActivityNode.java:150) at com.sonicsw.esb.itinerary.engine.ItineraryEngine.executeProcess(ItineraryEngine.java:347) at com.sonicsw.esb.itinerary.engine.ItineraryEngine.handleToken(ItineraryEngine.java:186) at com.sonicsw.esb.itinerary.engine.ItineraryEngine.handleMessage(ItineraryEngine.java:175) at com.sonicsw.xqimpl.endpoint.container.EndpointContextContainer.onMessage(EndpointContextContainer.java:119) at com.sonicsw.xq.connector.jms.JMSEndpointMessageListener.onMessage(JMSEndpointMessageListener.java:277) at progress.message.jimpl.Session.deliver(Session.java:3200) at progress.message.jimpl.Session.run(Session.java:2584) at progress.message.jimpl.Session$SessionThread.run(Session.java:2981) Caused by: java.net.ProtocolException: Invalid HTTP method: PATCH at java.net.HttpURLConnection.setRequestMethod(HttpURLConnection.java:440) at sun.net.www.protocol.http.HttpURLConnection.setRequestMethod(HttpURLConnection.java:552) at org.apache.cxf.transport.http.URLConnectionHTTPConduit.setupConnection(URLConnectionHTTPConduit.java:125) at org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit.setupConnection(AsyncHTTPConduit.java:165) at org.apache.cxf.transport.http.HTTPConduit.prepare(HTTPConduit.java:477) at org.apache.cxf.interceptor.MessageSenderInterceptor.handleMessage(MessageSenderInterceptor.java:46) ... 70 more
You are using an ESB environment.
Solution
This issue happens because the HTTP client used by CXF does not support PATCH by default. In order to get support for PATCH you have to switch to the async HTTP client:
- Set the following JVM system property on the container where Sonic Connect is deployed:
-Dorg.apache.cxf.transport.http.async.usePolicy="ALWAYS" -
Add all the JARs from the zip file attached to this article to the Sonic Connect service type classpath.