【问题标题】:Socket exception: Connection reset when unmarshalling with JAXB套接字异常:使用 JAXB 解组时连接重置
【发布时间】:2024-01-04 09:46:01
【问题描述】:

我能够使用 FileInputStream 将 xml 文件解组到类以读取 xml 内容,但在解组代码中使用 InputStream 而不是 FileInputStream 时遇到问题。

元帅:

try {
    JAXBContext jaxbContext = JAXBContext.newInstance(Message.class);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        JAXBElement<Message> je = 
            new JAXBElement<Message> (new QName(Message.class.getSimpleName()), Message.class, message);

    jaxbMarshaller.marshal(je, os);
} catch (JAXBException e) {
    e.printStackTrace();
}

解组:

JAXBContext jc = null;
try {       
    jc = JAXBContext.newInstance(Message.class);            
    Unmarshaller um = jc.createUnmarshaller();
    JAXBElement<Message> je = (JAXBElement<Message>) um.unmarshal(new StreamSource(is), Message.class);
    message = je.getValue();
} catch (JAXBException | FileNotFoundException e) {
    e.printStackTrace();
}

我得到的错误:

javax.xml.bind.UnmarshalException
 - with linked exception:
[java.net.SocketException: Connection reset]

【问题讨论】:

    标签: java xml serialization deserialization unmarshalling


    【解决方案1】:

    试试这样的。

    使用 JAXBIntrospector 获取值。

    String filepath="C:\\somepath";
    FileInputStream xml = new FileInputStream(filepath);
    Object result = unmarshaller.unmarshaller.unmarshal(xml);
    Message msg = (Message) JAXBIntrospector.getValue(result);
    
    StreamSource xml = new StreamSource(filepath);
    JAXBElement<Message> msgclass = 
    unmarshaller.unmarshal(xml, Message.class);
    

    【讨论】:

      【解决方案2】:

      'Connection reset' 与 XML、JAXB、unmarshalling 等无关。它通常是由于写入已被对等方关闭的连接而引起的。换句话说,应用程序协议错误。

      【讨论】: