docs: @Override
  	public Object invoke(String methodName, Object argument, Type returnType, Map<String, String> extraHeaders) throws Throwable {
  
  		final ObjectNode request = super.createRequest(methodName, argument);
  		final MultiValueMap<String, String> httpHeaders = new LinkedMultiValueMap<>();
  
  		for (Map.Entry<String, String> entry : this.headers.entrySet()) {
  			httpHeaders.add(entry.getKey(), entry.getValue());
  		}
  
  		if (extraHeaders != null) {
  			for (Map.Entry<String, String> entry : extraHeaders.entrySet()) {
  				httpHeaders.add(entry.getKey(), entry.getValue());
  			}
  		}
  
  		final HttpEntity<ObjectNode> requestHttpEntity = new HttpEntity<>(request, httpHeaders);
  		JsonNode response;
  
  		try {
  			response = this.restTemplate.postForObject(serviceUrl.get().toExternalForm(), requestHttpEntity, ObjectNode.class);
  		} catch (HttpStatusCodeException httpStatusCodeException) {
  			logger.error("HTTP Error code={} status={}\nresponse={}"
  					, httpStatusCodeException.getStatusCode().value()
  					, httpStatusCodeException.getStatusText()
  					, httpStatusCodeException.getResponseBodyAsString()
  			);
  			Integer jsonErrorCode = DefaultHttpStatusCodeProvider.INSTANCE.getJsonRpcCode(httpStatusCodeException.getStatusCode().value());
  			if (jsonErrorCode == null) {
  				jsonErrorCode = httpStatusCodeException.getStatusCode().value();
  			}
  			throw new JsonRpcClientException(jsonErrorCode, httpStatusCodeException.getStatusText(), null);
  		} catch (HttpMessageConversionException httpMessageConversionException) {
  			logger.error("Can not convert (request/response)", httpMessageConversionException);
  			throw new JsonRpcClientException(0, "Invalid JSON-RPC response", null);
  		}
  
  		return this.readResponse(returnType, response);
  	}