是否可以在不使用@WebServiceProvider 的情况下访问 JAX-WS 中的原始请求 XML?
Is it possible to access the raw request XML in JAX-WS without using @WebServiceProvider?
使用 @WebService
和 @WebMethod
定义的 JAX-WS 服务利用 JAXB 将 XML 转换为 Java 对象。对于大多数用例,这很棒!
但是,我需要与一些使用 Axis 1 编写的遗留代码进行交互,这些代码专门对 org.w3c.dom.Element
对象进行操作 - 换句话说,我实际上只需将参数直接转换回 XML 我一拿到它们,这看起来效率低得可怕。
因此,我一直在寻找一种从 JAX-WS 服务接收 return 原始 XML 的方法,无论是作为字符串还是作为对象。
我已经能够通过使用 @WebServiceProvider
和实现 Provider<Source>
接口来获得我需要的功能,但是对于我正在做的事情来说,这感觉有点太低级了做 - 我不能使用 @WebMethod
轻松设置路由;相反,我必须从 WebServiceContext
和 fiddle 中获取 PATH_INFO
和字符串来获取我需要的信息。
所以我的问题是,有没有一种方法可以在 JAX-WS 服务中使用原始 XML(有效地去除 JAXB)而不下降到 @WebServiceProvider
级别?
我只是自己偶然发现了答案,所以这里是给遇到这个问题的其他人的:
如 documentation 中所述,JAXB 可以将 xsd:anyType
编组为 Object
。结果对象的具体类型是 apache.xerces.internal.dom.ElementNSImpl
,它是 org.w3c.dom.Element
的实现 - 即正是我需要的!
因此,我的问题的解决方案就是在我的方法中使用 Object
作为参数和 return 类型。不是一个非常干净的感觉解决方案,但它有效。
使用 @WebService
和 @WebMethod
定义的 JAX-WS 服务利用 JAXB 将 XML 转换为 Java 对象。对于大多数用例,这很棒!
但是,我需要与一些使用 Axis 1 编写的遗留代码进行交互,这些代码专门对 org.w3c.dom.Element
对象进行操作 - 换句话说,我实际上只需将参数直接转换回 XML 我一拿到它们,这看起来效率低得可怕。
因此,我一直在寻找一种从 JAX-WS 服务接收 return 原始 XML 的方法,无论是作为字符串还是作为对象。
我已经能够通过使用 @WebServiceProvider
和实现 Provider<Source>
接口来获得我需要的功能,但是对于我正在做的事情来说,这感觉有点太低级了做 - 我不能使用 @WebMethod
轻松设置路由;相反,我必须从 WebServiceContext
和 fiddle 中获取 PATH_INFO
和字符串来获取我需要的信息。
所以我的问题是,有没有一种方法可以在 JAX-WS 服务中使用原始 XML(有效地去除 JAXB)而不下降到 @WebServiceProvider
级别?
我只是自己偶然发现了答案,所以这里是给遇到这个问题的其他人的:
如 documentation 中所述,JAXB 可以将 xsd:anyType
编组为 Object
。结果对象的具体类型是 apache.xerces.internal.dom.ElementNSImpl
,它是 org.w3c.dom.Element
的实现 - 即正是我需要的!
因此,我的问题的解决方案就是在我的方法中使用 Object
作为参数和 return 类型。不是一个非常干净的感觉解决方案,但它有效。