Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB空元素解组_Java_Xml_Exception_Jaxb - Fatal编程技术网

Java JAXB空元素解组

Java JAXB空元素解组,java,xml,exception,jaxb,Java,Xml,Exception,Jaxb,问题在于: 我得到了包含空元素的soap响应(例如,…) 因此,当JAXB想要解析这个元素时,就会抛出异常 而是使用null值设置适当的字段 如何配置JAXB以将空元素视为null? 我们是否可以仅使用JAXB(不使用某些第三方解决方法)来实现这一点 空字符串不是xsd:date类型的有效值。要对XML架构有效,可选元素应表示为不存在的节点 为什么基本问题会影响你 所有JAXB实现都将认识到空的String不是xsd:date的有效值。他们通过将其报告给ValidationEventHandl

问题在于:

我得到了包含空元素的soap响应(例如,
) 因此,当JAXB想要解析这个元素时,就会抛出异常 而是使用
null
值设置适当的字段

如何配置JAXB以将空元素视为null? 我们是否可以仅使用JAXB(不使用某些第三方解决方法)来实现这一点 空
字符串
不是
xsd:date
类型的有效值。要对XML架构有效,可选元素应表示为不存在的节点


为什么基本问题会影响你 所有JAXB实现都将认识到空的
String
不是
xsd:date
的有效值。他们通过将其报告给
ValidationEventHandler
的实例来实现这一点。通过执行以下操作,您可以自己看到这一点:

    Unmarshaller unmarshaller = jc.createUnmarshaller();
    unmarshaller.setEventHandler(new ValidationEventHandler() {

        @Override
        public boolean handleEvent(ValidationEvent event) {
            System.out.println(event);
            return true;
        }
    });
您正在使用的JAX-WS的实现利用了JAXB提供程序。在您正在使用的版本中,当遇到严重程度为
错误的
ValidationEvent
时,默认情况下,MOXy将引发异常,而不是像参考实现那样的
致命错误。这已在以下错误中修复:


变通 如果您直接使用JAXB API,只需覆盖默认的
ValidationEventHandler
。在JAX-WS环境中,可以使用
XmlAdapter
来提供自定义转换逻辑。我们将利用
XmlAdapter
来覆盖如何处理与
Date
之间的转换

XmlAdapter(日期适配器)


演示代码 下面是一个独立的示例,您可以运行它来查看一切是否正常

jaxb.properties

在一个独立的示例中,要使用MOXy作为JAXB提供程序,您需要在与域模型相同的包中包含一个名为
JAXB.properties
的文件,其中包含以下条目(请参阅:)

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <abc></abc>
    <qwe>2013-09-05</qwe>
</root>
输出

请注意,在封送的XML中,null的
Date
字段被封送为缺少的元素(请参阅:)


2013-09-05

您能分享更多信息吗?异常堆栈跟踪和一些代码可能?
import java.util.Date;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlSchemaType(name = "date")
    @XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class)
    private Date abc;

    @XmlSchemaType(name="date")
    @XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class)
    private Date qwe;

}
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <abc></abc>
    <qwe>2013-09-05</qwe>
</root>
import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum18617998/input.xml");
        Root root = (Root) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <qwe>2013-09-05</qwe>
</root>