Итак, у меня есть веб-сервис с несколькими пространствами имен, которые я бы хотел проложить через компонент, чтобы выполнить некоторую проверку учетных данных пользователя. Это было долгое время с тех пор, как я использовал XPATH, поэтому у меня может быть ошибка PICNIC (проблема в стуле не в компьютерном моменте).Apache Camel Java и XPath
сообщение веб-службы всегда будет иметь следующую структуру/шаблон:
<Operation>
<header with the head name space where the user credentials are stored>
<record control>
<objXX>
</Operation>
Вот пример сообщения (SOAP UI):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:list="http://www.insol.irix.com.au/IRIX_V1/Debtors/List" xmlns:head="http://www.insol.irix.com.au/IRIX_V1/Headers" xmlns:rec="http://www.insol.irix.com.au/IRIX_V1/RecordControl">
<soapenv:Header/>
<soapenv:Body>
<list:ListDebtorReq>
<head:MsgReqHdr>
<head:MsgGUID>${=java.util.UUID.randomUUID()}</head:MsgGUID>
<head:MsgDateTime>${=javax.xml.datatype.DatatypeFactory.newInstance().newXMLGregorianCalendar(GregorianCalendar.getInstance())}</head:MsgDateTime>
<head:ConsumerSystemIDInfo>
<head:ConsumerSystemID>ConsumerSystemID</head:ConsumerSystemID>
<head:ConsumerSystemUserID>AgentX</head:ConsumerSystemUserID>
</head:ConsumerSystemIDInfo>
<head:SecCredInfo>
<head:IRIXUserID>Some User ID</head:IRIXUserID>
<head:IRIXPassword>Some Password</head:IRIXPassword>
</head:SecCredInfo>
<head:CryptoInfo>
<head:DigitalSignatureInfo>
<head:DigitalSignatureValue>verrantque per auras</head:DigitalSignatureValue>
<head:DigitalSignatureAlgorithm>SHA-256</head:DigitalSignatureAlgorithm>
</head:DigitalSignatureInfo>
</head:CryptoInfo>
</head:MsgReqHdr>
<!--Optional:-->
<rec:RecCntrl>
<rec:StartRecordNumber>1</rec:StartRecordNumber>
<!--Optional:-->
<rec:NumberOfRecords>3</rec:NumberOfRecords>
</rec:RecCntrl>
</list:ListDebtorReq>
</soapenv:Body>
</soapenv:Envelope>
Поэтому в основном я хочу, чтобы иметь возможность создать компонент, который сможет запросить заголовок MsgReq для всех данных имени пользователя и пароля. Чтобы упростить вещи, я просто пытаюсь запросить MsgGUID и работать оттуда. Как бы то ни было, мне кажется, что он правильно прав xpath. Поскольку я использую несколько пространств имен, я включил их в файл контекста верблюда, чтобы убедиться, что они доступны.
Вот мой верблюд контекст:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
<import resource="classpath:META-INF/spring/camel-cxf.xml" />
<bean id="SecurityCheckBean" class="au.com.irix.insol.Security.IRIXSecurity"/>
<camelContext xmlns="http://camel.apache.org/schema/spring"
xmlns:list="http://www.insol.irix.com.au/IRIX_V1/Debtors/List"
xmlns:head="http://www.insol.irix.com.au/IRIX_V1/Headers"
xmlns:rec="http://www.insol.irix.com.au/IRIX_V1/RecordControl">
<route>
<from uri="cxf:bean:DebtorsService?dataFormat=PAYLOAD"/>
<bean ref="SecurityCheckBean"/>
</route>
</camelContext>
</beans>
Как вы можете видеть, что я бегу входящее сообщение от производителя веб-службы в SecurityCheckBean. Мой SecurityCheckBean очень прост в настоящий момент, см. Код ниже.
public class IRIXSecurity {
public void CheckCredentials(
@XPath("//head:MsgGUID") String msgGUID,
@Body String body){
System.out.println(body);
System.out.println("Check Credentials Invoked");
System.out.println(msgGUID);
}
}
Однако, когда я отправить запрос по мыльным UI я получаю следующее исключение:
Invalid xpath: //head:MsgGUID. Reason: javax.xml.xpath.XPathExpressionException: net.sf.saxon.trans.XPathException: Prefix head has not been declared
Так как же я идти о получении этой информации? Почему, несмотря на то, что я объявил пространства имен в моем файле camel-context.xml, они сообщаются как пропавшие без вести?
Просто ради процентной я попытался несколько вариаций XPATH, таких как:
@XPath("//MsgGUID")
@XPath("//MsgReqHdr/head:MsgGUID")
@XPath("//head:MsgReqHdr/head:MsgGUID")
Каждый раз, когда я либо получаю исключение, как указано выше, или значение NULL ...