【问题标题】:error unmarshaling jaxb from web service with MTOM使用 MTOM 从 Web 服务解组 jaxb 时出错
【发布时间】:2017-06-16 06:17:28
【问题描述】:

我有一个使用基于模式的有效负载的 jax-ws Web 服务。添加 MTOM 附件类型:

<xs:element name="Attachment" type="xs:base64Binary"
            xmime:expectedContentTypes="application/octet-stream" 
            minOccurs="0" maxOccurs="1" >
</xs:element>

ws-import 生成的 java 文件看起来是正确的:

@XmlRootElement(name = "Contact")
public class Contact {
    @XmlElement(name = "Attachment")
    @XmlMimeType("application/octet-stream")
    protected DataHandler attachment;

使用soapUI发送请求。

HTTP 标头:

 Accept-Encoding: gzip,deflate
 Content-Type: multipart/related; type=application/xop+xml; start=<rootpart@soapui.org>; start-info=text/xml; boundary=----=_Part_96_20541990.1485816424570
 SOAPAction: http://hsn.us.banner.hsntech.com/Level1Request
 MIME-Version: 1.0
 Content-Length: 47624
  [1]: https://i.stack.imgur.com/BEbZS.jpg

然后查看带有编码文件部分的 HTTP 部分:

------=_Part_96_20541990.1485816424570"
Content-Transfer-Encoding: binary"
Content-ID: <test1.jpg>"
Content-Disposition: attachment; name="test1.jpg"; filename="test1.jpg""
[0xff][0xd8][0xff][0xe0][0x0][0x10]JFIF[0x0][0x1][0x1][0x1][0x0]`[0x0]`[0x0][0x0][0xff][0xdb][0x0]C[0x0][\n]"... etc...

但不断收到此错误:

[Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.XMLMarshalException&#xd;
Exception Description: An error occurred unmarshalling the document&#xd;
Internal Exception: java.lang.IllegalArgumentException: MjAxNi0wMS0wNVQwOTowMDowMA==]</faultstring></ns0:Fault></S:Body></S:Envelope>

有什么建议吗?

【问题讨论】:

  • 所有 wsdl、注释、http 标头和 http 部分似乎都是正确的。也许这是一个 MOXY 错误。我建议尝试使用标准的 JAXB 上下文。
  • 我们正在使用 moxy 提供的 getValueByXPath() 函数的 moxy 特性从带有 xpath 的 jaxb 对象中提取值。我不认为标准的 JAXB 提供了这种能力。

标签: java jaxb eclipselink jax-ws mtom


【解决方案1】:

错误信息基本上告诉MjAxNi0wMS0wNVQwOTowMDowMA==这个值是非法的。如果你检查它,它是一个base64编码日期:

2016-01-05T09:00:00

我不知道您尝试解组的对象中是否还有其他字段。但是如果存在解组过程无法处理 base64 编码值。您应该检查某处是否需要适配器。

一句话:你可能应该有一个base64解码器或检查原始服务,因为解码后的String并不是真正的二进制数据。

(如果您插入所有使用的代码,我可以深入研究一下。)

【讨论】:

  • 是二进制数据。问题是,它不应该包含在 jaxb 中,而是可以通过作为对象定义一部分的 DataHandler 对象进行提取。对不起,但并没有真正让我走得更远。谢谢。
  • 尝试将 DataHandler 更改为 Object 并检查在调试会话中设置的内容。对我来说,为什么你认为文件处理是问题,而错误显示一些 base64 编码日期仍然很模糊。
猜你喜欢
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
相关资源
最近更新 更多