Apache的骆驼的Java和XPath [英] Apache Camel Java and XPath

查看:524
本文介绍了Apache的骆驼的Java和XPath的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以,我有几个命名空间的Web服务,我想借道豆做用户凭据的一些检查。它一直是因为我使用的XPath,所以我可能只是野餐很长一段时间(问题在主席不在电脑瞬间)错误。

So I have a web service with several namespaces that I would like to route through a bean to do some checking of user credentials. Its been a long time since I used XPATH so I might just be having a PICNIC(Problem In Chair Not In Computer Moment) error.

Web服务消息总是具有以下结构/图案:

The web service message will always have the following structure/pattern :

<Operation>
    <header with the head name space where the user credentials are stored>
    <record control>
    <objXX>
</Operation>

下面是一个示例消息(SOAP UI):

Here is a example message(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>

所以基本上我希望能够创建一个bean,将能够查询MsgReq头为所有的用户名和密码的数据。为简单起见,我只是想查询MsgGUID,并从那里的工作我的方式。不过,我似乎无法得到正确的XPath。由于我使用我在骆驼背景文件中包含一些他们刚刚命名空间,以确保它们是可用的。

So essentially I want to be able to create a bean that will be able to query the MsgReq header for all the user name and password data. To simplify things I am just trying to query the MsgGUID and work my way from there. However I cant seem to get the xpath right. Since I am using several namespaces I have included them in the camel context file just to make sure they are available.

下面是我的骆驼上下文:

Here is my camel-context:

<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>

正如你可以看到我正在运行Web服务生产者向SecurityCheckBean的传入消息。我SecurityCheckBean是目前超级简单见下文code。

As you can see I am running the incoming message of the web service producer to the SecurityCheckBean. My SecurityCheckBean is super simple at the moment see code below.

  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);



    }
}

然而,当我送送通过SOAP UI的请求,我得到了以下异常:

However when I send a send a request via soap UI I get the following exception:

Invalid xpath: //head:MsgGUID. Reason: javax.xml.xpath.XPathExpressionException: net.sf.saxon.trans.XPathException: Prefix head has not been declared

因此​​,我怎么去获取这些信息?为什么即使我已经在我的骆驼context.xml中声明的名字空间它们被列为失踪?

So how do I go about retrieving this information? Why even though I have declared the name spaces in my camel-context.xml they are reported as missing?

只是为了兴趣缘故,我已经试过了XPATH的几个变化,如:

Just for interest sake I have tried several variations of the XPATH such as:

@XPath("//MsgGUID")
@XPath("//MsgReqHdr/head:MsgGUID")
@XPath("//head:MsgReqHdr/head:MsgGUID")

我每次要么得到一个异常如上所列或NULL值...

Every time I either get an exception as listed above or a NULL value...

推荐答案

右键得到它的工作。当与命名空间中的一个bean处理下面的语法必须使用包括命名空间。

Right got it to work. When dealing with the namespaces in a bean the following syntax must be used to include the namespaces.

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);





    }
}

这篇关于Apache的骆驼的Java和XPath的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆