Java org.apache.cxf.interceptor.Fault:解组错误:遇到非法字符(NULL,unicode 0):在任何内容中无效

Java org.apache.cxf.interceptor.Fault:解组错误:遇到非法字符(NULL,unicode 0):在任何内容中无效,java,web-services,jaxb,jax-ws,cxf,Java,Web Services,Jaxb,Jax Ws,Cxf,我正在使用一个CXFWebService,它使用本地传输并从java应用程序访问webservice。 Webservice正在读取文件并通过Webservice调用发送。我使用的字节大小为512。假设文件大小为1200。检索文件的前两次尝试是成功的,对于最后一个块,我得到org.apache.cxf.interceptor.Fault:解组错误:遇到非法字符(NULL,unicode 0):在任何内容中都无效 这里chunk表示512字节。我正在将字节转换为字符串并从web服务返回。在最后一个

我正在使用一个CXFWebService,它使用本地传输并从java应用程序访问webservice。 Webservice正在读取文件并通过Webservice调用发送。我使用的字节大小为512。假设文件大小为1200。检索文件的前两次尝试是成功的,对于最后一个块,我得到org.apache.cxf.interceptor.Fault:解组错误:遇到非法字符(NULL,unicode 0):在任何内容中都无效

这里chunk表示512字节。我正在将字节转换为字符串并从web服务返回。在最后一个块中,只有16字节的值被填充,其余的值被零填充。 任何帮助都将不胜感激。 我使用的是cxf webservice 2.7.5、jdk1.7和Redhat Linux

堆栈跟踪:

org.apache.cxf.interceptor.Fault: Unmarshalling Error: Illegal character (NULL, unicode 0) encountered: not valid in any content
 at [row,col {unknown-source}]: [2,1]
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:808)
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:629)
        at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:157)
        at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:103)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
        at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:800)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1592)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1490)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1309)
        at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
        at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:622)
        at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
        at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319)
        at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
        at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:133)
        at $Proxy62.getJobLog(Unknown Source)
        at com.java.process.AClass.getMessage(AClass.java:468)
        at com.java.process.AClass.getXXXX(AClass.java:156)
        at com.java.process.AClass.main(CLIClientStartup.java:409)
Caused by: javax.xml.bind.UnmarshalException
 - with linked exception:
[com.ctc.wstx.exc.WstxUnexpectedCharException: Illegal character (NULL, unicode 0) encountered: not valid in any content
 at [row,col {unknown-source}]: [2,1]]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:436)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:372)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:349)
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.doUnmarshal(JAXBEncoderDecoder.java:769)
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.access$100(JAXBEncoderDecoder.java:94)
        at org.apache.cxf.jaxb.JAXBEncoderDecoder$1.run(JAXBEncoderDecoder.java:797)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:795)
        ... 23 more
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Illegal character (NULL, unicode 0) encountered: not valid in any content
 at [row,col {unknown-source}]: [2,1]
        at com.ctc.wstx.sr.StreamScanner.constructNullCharException(StreamScanner.java:630)
        at com.ctc.wstx.sr.StreamScanner.throwInvalidSpace(StreamScanner.java:660)
        at com.ctc.wstx.sr.BasicStreamReader.readTextPrimary(BasicStreamReader.java:4576)
        at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2879)
        at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1072)
        at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:196)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:370)
        ... 29 more

导致这些XmlException的问题是 读取或加载的包含的字符根据 XML规范。几乎所有这些字符都是ASCII码 控制字符范围(想想像null、bell、, 退格等)。这些角色没有任何商业价值 在XML数据中;它们是非法字符,应该删除, 通常已经从文件格式中找到了进入数据的方法 转换,例如当有人试图从Excel创建XML文件时 或将其数据从可存储为的格式导出为XML 二进制的

以及在解组之前清理数据的示例。

也许你应该使用一些开箱即用的东西来传输文件,比如MTOM

或者可以使用包装内容,使计算结果为null的部分
将作为文本接收。

转到项目属性并将项目编码更改为UTF-8。 对于marshaller和unmarchaller也使用以下命令

    private static void exportToXML(JAXBContext ctx , Object obj , OutputStream stream) throws Exception{
    try {
        Marshaller m = ctx.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

        m.marshal(obj, stream);
    } catch (JAXBException e) {
        e.printStackTrace();
    }       
}

private static Object importXML(JAXBContext ctx , String xmlStr) throws Exception {
    try {           
        Unmarshaller m = ctx.createUnmarshaller();
        ByteArrayInputStream is = new ByteArrayInputStream(xmlStr.getBytes("UTF-8"));

        return m.unmarshal(is);

    } catch (Throwable e) {e.printStackTrace();}

}

谢谢你的回复。上述异常是因为字符串在最后一个块中包含零。在最后一段中,连续的零表示为空[如ascii/utf-8中那样],因此它会抛出这样的异常。那么这些零是您的内容的一部分吗?使用MTOM发送文件怎么样?也许这是一个解决方案?检查我的更新。也许CDATA语法可以解决您的问题?CDATA不会使无效字符有效。它们仍然会使XML验证失败。