Hi everyone, after upgrading the Java implementation of Camel from 2.13.0 to 2.17.2 (and cxf-rt-frontend-jaxrs from 2.7.10 to 3.1.5, and spring framework from 3.2.8 to 4.3.2), the webapp that is serving as a proxy stopped working correctly.
The app is supposed to intercept a webservice request, modify fields that are defined in a properties file throught the ContextManager class, and forward the request to the correct endpoint. After the upgrade, the app is unable to set the missing fields in the original request, thus returning the following message: "REQUEST_MESSAGE_NOT_COMPLIANT_WITH_SCHEMA - Your request message does not comply to the web service schema". This is of course expected since the missing fields are not being set. Any help would be greatly appreciated. My Camel route definition is as follows: *CreditLimitRequestServiceRoute.class* public class CreditLimitRequestServiceRoute extends AbstractEHRoute { @Autowired private ContextManager contextManager; @Override public void configure() throws Exception { Namespaces ns = new Namespaces("ns1", "http://ehsmartlink/commonError"); onException(SoapFault.class) .to("consoleflux:message?level=ERROR&text=${exception.message}&content=${exception.detail}") .setHeader("soapFaultDetail", simple("${exception.detail}")) .choice() .when(and(header("soapFaultDetail").isNotNull(), xpath("//ns1:commonError/errorType/text() = 'BusinessError'", ns, "soapFaultDetail"))) .to("consoleflux:finish?ignoreContent=true") .otherwise() .to("consoleflux:error?ignoreContent=true"); onException(Exception.class) .to("consoleflux:error"); from("cxf:bean:creditLimitRequestServiceProxy?dataFormat=PAYLOAD").routeId("creditLimitRequestServiceRoute") .log(LoggingLevel.INFO, "Invocation du WS").streamCaching() .to("consoleflux:start?source=SOA&dest=EH&type=CREDIT_LIMIT") .to("consoleflux:message?ignoreContent=true&text=Affectation du Contexte EH") .setHeader("context").xpath("//context") .bean(contextManager, "setContext") .to("consoleflux:message?ignoreContent=true&text=Invocation du WS EH ${headers.operationName}") .to("cxf:bean:creditLimitRequestService?dataFormat=PAYLOAD") .to("consoleflux:finish"); } } *AbstractEHRoute.class* public abstract class AbstractEHRoute extends RouteBuilder { protected XPathBuilder xpath(String text, Namespaces namespaces, String headerName) { XPathBuilder xpath = XPathBuilder.xpath(text).namespaces(namespaces); xpath.setHeaderName(headerName); return xpath; } } *ContextManager* package com.stef.soa.eh.integration.beans; import static com.google.common.base.Objects.firstNonNull; import static com.google.common.base.Strings.isNullOrEmpty; import java.util.Map; import java.util.UUID; import org.apache.camel.Header; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; @Component public class ContextManager { private static final String USER_NAME = "userName"; private static final String USER_PASSWORD = "userPassword"; private static final String LANGUAGE_TEXT_IDENTIFIER = "languageTextIdentifier"; private static final String TRANSACTION_IDENTIFIER = "transactionIdentifier"; private static final String POLICIY_IDENTIFIER = "policyIdentifier"; private static final String POLICY_EXTENSION_IDENTIFIER = "policyExtensionIdentifier"; private static final String POLICY_EHBU_IDENTIFIER = "policyEHBUIdentifier"; private static final String IP_ADRESS = "ipAdress"; @Value("${eh.context.userName}") private String userName; @Value("${eh.context.userPassword}") private String userPassword; @Value("${eh.context.languageTextIdentifier}") private String languageTextIdentifier; @Value("${eh.context.policyIdentifier}") private String policyIdentifier; @Value("${eh.context.policyExtensionIdentifier}") private String policyExtensionIdentifier; @Value("${eh.context.policyEHBUIdentifier}") private String policyEHBUIdentifier; @Value("${eh.context.ipAdress}") private String ipAdress; public void setContext(@Header("context") Node context) { Preconditions.checkNotNull(context, "Le contexte doit ĂȘtre renseignĂ©"); // Suppression des noeuds enfants avec sauvegarde les valeurs courantes dans une map Map<String, String> currentValues = Maps.newHashMap(); NodeList list = context.getChildNodes(); for (int i = list.getLength() - 1; i >= 0; i--) { Node child = list.item(i); if (child.getNodeType() == Node.ELEMENT_NODE && !isNullOrEmpty(child.getTextContent())) { currentValues.put(child.getNodeName(), child.getTextContent()); } context.removeChild(child); } // Ajout des noeuds enfants appendChild(context, USER_NAME, userName, currentValues); appendChild(context, USER_PASSWORD, userPassword, currentValues); appendChild(context, LANGUAGE_TEXT_IDENTIFIER, languageTextIdentifier, currentValues); appendChild(context, TRANSACTION_IDENTIFIER, UUID.randomUUID().toString(), currentValues); appendChild(context, POLICIY_IDENTIFIER, policyIdentifier, currentValues); appendChild(context, POLICY_EXTENSION_IDENTIFIER, policyExtensionIdentifier, currentValues); appendChild(context, POLICY_EHBU_IDENTIFIER, policyEHBUIdentifier, currentValues); appendChild(context, IP_ADRESS, ipAdress, currentValues); } private void appendChild(Node node, String name, String value, Map<String, String> currentValues) { Document document = node.getOwnerDocument(); Element child = document.createElement(name); child.setTextContent(firstNonNull(currentValues.get(name), value)); node.appendChild(child); } } *context.xml* <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="classpath:eh.properties, file:///${eh.home}/conf/eh.properties" ignore-resource-not-found="true" system-properties-mode="OVERRIDE" /> <context:component-scan base-package="com.stef.soa.eh" /> <context:annotation-config /> <import resource="classpath:META-INF/eh/spring/broker.xml" /> <import resource="classpath:META-INF/eh/spring/camel.xml" /> <import resource="classpath:META-INF/eh/spring/cxf.xml" /> <import resource="classpath:META-INF/soa-console-flux-client/spring/context.xml"/> </beans> *camel.xml* <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:http="http://cxf.apache.org/transports/http/configuration" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd" > <camelContext xmlns="http://camel.apache.org/schema/spring" id="ehContext"> <properties> <property key="org.apache.camel.xmlconverter.output.indent" value="yes"/> <property key="org.apache.camel.xmlconverter.output.{http://xml.apache.org/xslt}indent-amount" value="4"/> </properties> <package>com.stef.soa.eh.integration</package> </camelContext> </beans> *cxf.xml* <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://camel.apache.org/schema/cxf" xmlns:http="http://cxf.apache.org/transports/http/configuration" xmlns:sec="http://cxf.apache.org/configuration/security" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd" > <http:conduit name="*.http-conduit"> <http:client ProxyServer="${proxy.host}" ProxyServerPort="${proxy.port}" ConnectionTimeout="${http.client.connectionTimeout}" ReceiveTimeout="${http.client.receiveTimeout}" /> <http:proxyAuthorization> <sec:UserName>${proxy.username}</sec:UserName> <sec:Password>${proxy.password}</sec:Password> </http:proxyAuthorization> <http:tlsClientParameters> <sec:keyManagers keyPassword="${eh.keyStore.password}"> <sec:keyStore type="pkcs12" password="${eh.keyStore.password}" file="${eh.home}/${eh.keyStore.file}" /> </sec:keyManagers> </http:tlsClientParameters> </http:conduit> <cxf:cxfEndpoint id="creditLimitRequestServiceProxy" address="/creditLimitRequestService" wsdlURL="META-INF/eh/wsdl/CreditLimitRequestService/EH_SMARTLINK_CreditLimitRequestServiceV4.wsdl" serviceName="ns:CreditLimitRequestServiceV4" endpointName="ns:CreditLimitRequestServiceV4" xmlns:ns="http://ehsmartlink/CreditLimitRequestService/v4" /> <cxf:cxfEndpoint id="creditLimitRequestService" address="${eh.creditLimitRequestService.url}" wsdlURL="META-INF/eh/wsdl/CreditLimitRequestService/EH_SMARTLINK_CreditLimitRequestServiceV4.wsdl" serviceName="ns:CreditLimitRequestServiceV4" endpointName="ns:CreditLimitRequestServiceV4" xmlns:ns="http://ehsmartlink/CreditLimitRequestService/v4" loggingFeatureEnabled="true" /> <cxf:cxfEndpoint id="customerListRetrieveServiceProxy" address="/customerListRetrieveService" wsdlURL="META-INF/eh/wsdl/CustomerListRetrieveService/CustomerListRetrieveV2.wsdl" serviceName="ns:CustomerListRetrieveServiceV2" endpointName="ns:CustomerListRetrieveServiceV2" xmlns:ns="http://ehsmartlink/CustomerListRetrieve/v2" /> <cxf:cxfEndpoint id="customerListRetrieveService" address="${eh.customerListRetrieveService.url}" wsdlURL="META-INF/eh/wsdl/CustomerListRetrieveService/CustomerListRetrieveV2.wsdl" serviceName="ns:CustomerListRetrieveServiceV2" endpointName="ns:CustomerListRetrieveServiceV2" xmlns:ns="http://ehsmartlink/CustomerListRetrieve/v2" loggingFeatureEnabled="true" /> <cxf:cxfEndpoint id="firstEuroListRepertoireReadServiceProxy" address="/firstEuroListRepertoireReadService" wsdlURL="META-INF/eh/wsdl/FirstEuroListRepertoireReadService/EH_SMARTLINK_FirstEuroListRepertoireReadService-v1.wsdl" serviceName="ns:FirstEuroListRepertoireReadService-v1" endpointName="ns:FirstEuroListRepertoireReadServicePort-v1_soap11" xmlns:ns="http://eulerhermes.com/SMARTLINK/services/FirstEuroListRepertoireReadService/v1" /> <cxf:cxfEndpoint id="firstEuroListRepertoireReadService" address="${eh.firstEuroListRepertoireReadService.url}" wsdlURL="META-INF/eh/wsdl/FirstEuroListRepertoireReadService/EH_SMARTLINK_FirstEuroListRepertoireReadService-v1.wsdl" serviceName="ns:FirstEuroListRepertoireReadService-v1" endpointName="ns:FirstEuroListRepertoireReadServicePort-v1_soap11" xmlns:ns="http://eulerhermes.com/SMARTLINK/services/FirstEuroListRepertoireReadService/v1" loggingFeatureEnabled="true" /> <cxf:cxfEndpoint id="firstEuroListRepertoireUpdateServiceProxy" address="/firstEuroListRepertoireUpdateService" wsdlURL="META-INF/eh/wsdl/FirstEuroListRepertoireUpdateService/EH_SMARTLINK_FirstEuroListRepertoireUpdateService-v1.wsdl" serviceName="ns:FirstEuroListRepertoireUpdateService-v1" endpointName="ns:FirstEuroListRepertoireUpdateServicePort-v1" xmlns:ns="http://eulerhermes.com/SMARTLINK/services/FirstEuroListRepertoireUpdateService/v1" /> <cxf:cxfEndpoint id="firstEuroListRepertoireUpdateService" address="${eh.firstEuroListRepertoireUpdateService.url}" wsdlURL="META-INF/eh/wsdl/FirstEuroListRepertoireUpdateService/EH_SMARTLINK_FirstEuroListRepertoireUpdateService-v1.wsdl" serviceName="ns:FirstEuroListRepertoireUpdateService-v1" endpointName="ns:FirstEuroListRepertoireUpdateServicePort-v1" xmlns:ns="http://eulerhermes.com/SMARTLINK/services/FirstEuroListRepertoireUpdateService/v1" loggingFeatureEnabled="true" /> <cxf:cxfEndpoint id="limitDetailReadServiceProxy" address="/limitDetailReadService" wsdlURL="META-INF/eh/wsdl/LimitDetailReadService/EH_SMARTLINK_LimitDetailReadService-v2.wsdl" serviceName="ns:LimitDetailReadService-v2" endpointName="ns:LimitDetailReadServicePort-v2" xmlns:ns="http://eulerhermes.com/SMARTLINK/services/LimitDetailReadService/v2" /> <cxf:cxfEndpoint id="limitDetailReadService" address="${eh.limitDetailReadService.url}" wsdlURL="META-INF/eh/wsdl/LimitDetailReadService/EH_SMARTLINK_LimitDetailReadService-v2.wsdl" serviceName="ns:LimitDetailReadService-v2" endpointName="ns:LimitDetailReadServicePort-v2" xmlns:ns="http://eulerhermes.com/SMARTLINK/services/LimitDetailReadService/v2" loggingFeatureEnabled="true" /> </beans> -- View this message in context: http://camel.465427.n5.nabble.com/Camel-route-not-working-after-update-from-Camel-2-13-0-to-2-17-2-tp5797156.html Sent from the Camel - Users mailing list archive at Nabble.com.