当前位置: 首页 > 知识库问答 >
问题:

在groovy中使用JAXB取消对java POJO的SOAP响应

阎烨
2023-03-14

我正试图在groovy中使用JAXB取消对java POJO的SOAP响应,但遇到了一些问题

下面是我的XML

String xml = '''<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap:Body>
      <SignResult xmlns="http://www.tw.com/tsswitch">
         <Result>
            <Code>OK</Code>
            <Desc>The operation completed successfully</Desc>
         </Result>
         <SignedDocument>TUlNRS1WZXJzaW9uOiAxLjANCkRhdGU6IFdlZCwgMTkgQXByIDIwMTcgMDY6MDA6NDMgKzINCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3NpZ25lZDsgcHJvdG9jb2w9ImFwcGxpY2F0aW9uL3BrY3M3LXNpZ25hdHVyZSI7IG1pY2FsZz0NCg==</SignedDocument>
         <Details>success</Details>
      </SignResult>
   </soap:Body>
</soap:Envelope>'''

下面是我的SignResponsePOJO

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SignResponse", propOrder = {
    "result",
    "signedDocument",
    "archive",
    "details"
})
public class SignResponse {

    @XmlElement(name = "Result")
    protected Result result;
    @XmlElement(name = "SignedDocument")
    protected byte[] signedDocument;
    @XmlElement(name = "Archive")
    protected byte[] archive;
    @XmlElement(name = "Details")
    protected String details;
    }
javax.xml.soap.SOAPMessage message = javax.xml.soap.MessageFactory.newInstance().createMessage(null, new java.io.ByteArrayInputStream(xml.getBytes()));
javax.xml.bind.Unmarshaller unmarshaller = javax.xml.bind.JAXBContext.newInstance(SignResponse.class).createUnmarshaller();
SignResponse signResponse = unmarshaller.unmarshal(message.getSOAPBody().extractContentAsDocument()); //line 22
Caused by: java.lang.NoSuchMethodError: org.apache.axiom.om.OMAbstractFactory.getMetaFactory(Ljava/lang/String;)Lorg/apache/axiom/om/OMMetaFactory;
at org.apache.axis2.saaj.SOAPPartImpl.<init>(SOAPPartImpl.java:141)
at org.apache.axis2.saaj.SOAPMessageImpl.<init>(SOAPMessageImpl.java:116)
at org.apache.axis2.saaj.MessageFactoryImpl.createMessage(MessageFactoryImpl.java:133)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:218)
at AaTestGroovyTest.run(AaTestGroovyTest:22)
import javax.xml.stream.*
import javax.xml.bind.*

Reader reader = new StringReader(xml);
XMLInputFactory factory = XMLInputFactory.newInstance(); // Or newFactory()
XMLStreamReader xsr = factory.createXMLStreamReader(reader);    
xsr.nextTag(); // Advance to Envelope tag
xsr.nextTag(); // Advance to Body tag
xsr.nextTag(); // Advance to getNumberResponse tag


JAXBContext jc = JAXBContext.newInstance(SignResponse.class);
Unmarshaller unmarshaller1 = jc.createUnmarshaller();
JAXBElement<SignResponse> je = unmarshaller1.unmarshal(xsr, SignResponse.class);
def signResponse = je.getValue();
println "signedDocument = "+signResponse.signedDocument

但是对于第二种方法,我将获得signeddocument=null

有人能帮我一下吗?

共有1个答案

李睿
2023-03-14

不确定您是否真的需要仅在Groovy中使用Jaxb的解决方案,而使用xmlslurper读取和提取它非常简单,只需要一个liner,如下所示:

您应该能够使用Groovy中的below语句从xml中获取SingedDocument值。

//pass xml string to below parseText method
println new XmlSlurper().parseText(xml).'**'.find {it.name() == 'SignedDocument'}.text()

您可以快速尝试联机演示

def byteArraySignedDocument = new XmlSlurper().parseText(xml).'**'.find {it.name() == 'SignedDocument'}.text() as byte[]
assert byteArraySignedDocument instanceof byte[]
 类似资料:
  • 我想比较从SOAP响应和JDBC请求获取的节点下元素的值。我可以用下面的groovy代码打印这些值,但由于我不太擅长编码,所以无法进行比较。 注意:两个响应中的元素名称相同,但顺序不同。 我想根据两个响应中的元素名称比较值,而不管元素的顺序如何。注意:仅当JDBC元素值不为空时才进行比较。 def groovyUtils=新com。eviware。soapui。支持GroovyUtils(上下文)

  • 问题内容: 我有一个正在建立的用于访问Web服务的客户端。我正在使用一些JAXB生成的类(Netbeans 6.9)来解组我的xml数据。 尝试从此Web服务解组InputStream响应时遇到意外元素错误,如果将响应保存到文件中,也会遇到相同的意外元素错误。 将数据保存到文件后,我可以进入并删除SOAP标签(信封,正文,标题),然后毫无问题地进行解组。 我还没有真正找到一种使拆封忽略这些标签的方

  • 只有在soap信封已被移除的情况下,JAXB才能解组XML。然而,我试图解组的SOAP响应在SOAP信封上有其名称空间声明。如果删除soap信封,名称空间声明也将被删除。因此,标签的前缀将指无。这会导致JAXB抛出错误。如果在SOAP信封上声明了名称空间,如何使用JAXB对SOAP响应进行解组? 我需要解组的XML的类似示例如下: 如果我拿掉肥皂信封,会发生这样的事情: 如果我移除soap信封,名

  • 我有一个4个测试套件的soap项目,每个测试套件都有一些测试用例,每个测试用例都有一些测试步骤[Soap请求,Groovy脚本]我能够使用下面提到的代码访问所有属性,但是,代码在本地系统中写入空白请求/响应文件** **请帮助解决这个问题,**

  • 问题内容: 如果已删除肥皂信封,JAXB只能解组XML。但是,我要解组的SOAP响应在soap信封上有其名称空间声明。如果我删除肥皂信封,则名称空间声明也将被删除。因此,标签的前缀将不涉及任何前缀。这将导致JAXB引发错误。如果在SOAP信封上声明了名称空间,如何使用JAXB解组SOAP响应? 我需要解组的XML的类似示例如下: 如果我取下肥皂信封,会发生以下情况: 如果删除了肥皂信封,则名称空间

  • 我有一个用C#编写的REST API。方法DoQuery将查询发送到数据库,并获得json作为响应