2013-05-27 6 views
0

Итак, у меня есть веб-сервис с несколькими пространствами имен, которые я бы хотел проложить через компонент, чтобы выполнить некоторую проверку учетных данных пользователя. Это было долгое время с тех пор, как я использовал 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 ...

ответ

0

правый получил его работать. При работе с пространствами имен в bean-компоненте для включения пространств имен необходимо использовать следующий синтаксис.

public class IRIXSecurity { 



    public void CheckCredentials(
      //@Body ListDebtorReqType msgBody, @Headers Map hdr, 

      @XPath(value="//header:MsgGUID",namespaces = @NamespacePrefix(
        prefix = "header", 
        uri = "http://www.insol.irix.com.au/IRIX_V1/Headers")) String msgGUID, 
      @Body Document xml) 
    { 


     System.out.println("Check Credentials Invoked"); 
     System.out.println(msgGUID); 
     //exchange.getOut().setBody(debtorRsType); 





    } 
}