Start a conversation

REST call fails with error: Invalid HTTP method: PATCH

 

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:
  1. Set the following JVM system property on the container where Sonic Connect is deployed:
    -Dorg.apache.cxf.transport.http.async.usePolicy="ALWAYS" 

  2. Add all the JARs from the zip file attached to this article to the Sonic Connect service type classpath.

    User-added image 


 

jar_files.zip

  1. 949 KB
  2. View
  3. Download
Choose files or drag and drop files
Was this article helpful?
Yes
No
  1. Priyanka Bhotika

  2. Posted
  3. Updated

Comments