当前位置: 首页 > 面试题库 >

如何使用JaXB获得验证事件?

公西天逸
2023-03-14
问题内容

我尝试使用Jaxb在变量中获取验证消息。从此处尝试示例http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/api/javax/xml/bind/Unmarshaller.html

我的代码:

JAXBContext jaxbContext = JAXBContext.newInstance("com.piyush");
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new StreamSource(new File("D:/liferay-develop/workspace/cat_test/v1/STD_MP.xsd")));
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
jaxbUnmarshaller.setSchema(schema);
ValidationEventCollector validationCollector= new ValidationEventCollector();
jaxbUnmarshaller.setEventHandler( validationCollector );
STDMP ts = (STDMP)jaxbUnmarshaller.unmarshal(xml_gkuzu);
if(validationCollector.hasEvents())
{
    for(ValidationEvent event:validationCollector.getEvents())
    {
        String msg = event.getMessage();
        System.out.println(msg);
    }
}

但是什么也没发生。我究竟做错了什么 ?


问题答案:

以下内容应有所帮助:

JAXB2ValidationEventCollector

ValidationEventCollector来自JAXB
1(JSR-31),
并且似乎不太支持我们在JAXB
2(JSR-222)中
对验证所做的更改。您可以通过创建ValidationEventHandler类似于以下内容的子类来解决此问题。

package forum12295028;

import javax.xml.bind.ValidationEvent;
import javax.xml.bind.util.ValidationEventCollector;

class JAXB2ValidationEventCollector extends ValidationEventCollector {

    @Override
    public boolean handleEvent(ValidationEvent event) {
        super.handleEvent(event);
        return true;
    }

}

以下示例可用于证明一切正常

顾客

package forum12295028;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Customer {

    private String name;

    private List<PhoneNumber> phoneNumbers = 
        new ArrayList<PhoneNumber>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElement(name="phone-number")
    public List<PhoneNumber> getPhoneNumbers() {
        return phoneNumbers;
    }

    public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }

}

电话号码

package forum12295028;

public class PhoneNumber {

}

客户.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="customer">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="stringMaxSize5"/>
                <xs:element ref="phone-number" maxOccurs="2"/>
             </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="phone-number">
        <xs:complexType>
            <xs:sequence/>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="stringMaxSize5">
        <xs:restriction base="xs:string">
            <xs:maxLength value="5"/>
        </xs:restriction>
    </xs:simpleType>

</xs:schema>

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<customer>
   <name>Jane Doe</name>
   <phone-number/>
   <phone-number/>
   <phone-number/>
</customer>

演示版

package forum12295028;

import java.io.File;

import javax.xml.XMLConstants;
import javax.xml.bind.*;
import javax.xml.bind.util.ValidationEventCollector;
import javax.xml.validation.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
        Schema schema = sf.newSchema(new File("src/forum12295028/customer.xsd"));

        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.setSchema(schema);
        ValidationEventCollector validationCollector = new JAXB2ValidationEventCollector();
        unmarshaller.setEventHandler(validationCollector);

        Customer customer = (Customer) unmarshaller.unmarshal(new File("src/forum12295028/input.xml"));

        if(validationCollector.hasEvents())
        {
            for(ValidationEvent event:validationCollector.getEvents())
            {
                String msg = event.getMessage();
                System.out.println(msg);
            }
        }
    }

}

输出量

cvc-maxLength-valid: Value 'Jane Doe' with length = '8' is not facet-valid with respect to maxLength '5' for type 'stringMaxSize5'.
cvc-type.3.1.3: The value 'Jane Doe' of element 'name' is not valid.
cvc-complex-type.2.4.d: Invalid content was found starting with element 'phone-number'. No child element is expected at this point.


 类似资料:
  • 问题内容: 我有工作,并为我解编和编组XML转换为Java对象,反之亦然。现在,我试图根据我们的模式(test.xsd)来验证我们的XML。假设我的XML中缺少任何必填字段,那么我想根据模式test.xsd验证XML后知道哪个字段缺失。 如何根据test.xsd模式验证XML。我的test.xsd模式路径是- C:\ workspace \一\二\三\ src \ main \ java \ co

  • 我使用xjc将XML转换为JAXB元素,并执行编组操作。但是,xml中的一些字段没有根据xsd进行验证。 例如:我已经给出了一个作为整数的字段,但其接受字符串并没有抛出验证错误。

  • 当我使用JAXB验证XML文件时,您能帮我获取所有错误的列表吗? 现在我已经实现了同样的代码。我已经通过对XML文件进行解组来实现代码。 如果XML文件中有任何错误,那么当我在当时解组XML文件时,我得到了异常,但在给出第一个异常后出现了异常,但我想要该XML文件所有错误的列表。这不应该在出现第一个错误后出现。 XSD文件: 验证事件处理程序类 } 事件严重性:FATAL\u错误消息:cvc复杂类

  • 类定义为: 要加载的xml示例部分: 我创建了一个验证收集器,以显示针对架构解封xml文件过程中所有验证错误,但结果令人困惑:验证收集器将继承我的RemoteHost的每个类的验证错误显示为: 元素“host firstsubtype”不能有字符或元素信息项[children],因为该类型的内容类型为空。 元素“Other HostType”必须没有字符或元素信息项[childrens],因为该类

  • 问题内容: 最近,我不得不迁移到新机器并重新安装了Eclipse。目前,我需要从xsd生成JAXB类。我不太记得我安装了什么,但是在旧的Eclipse中,我有- rightclick-generate-jaxb类选项。 谁知道我必须安装/插入什么才能取回它? 我当时正在安装Dali,这似乎是正确的,但是我很确定我上次没有安装Dali。上次,我还在构建路径中包括了jaxb jars,所以应该没问题。

  • 我有一些带有JAXB注释的类,我创建了一些实例,我需要根据我的XSD文件验证它们。当对象无效时,我应该能够得到错误的详细信息。 到目前为止,我还不走运,我知道这个类ValidationEventHandler,但显然我可以将它用于解组器类,问题是我必须验证对象,而不是原始XML。 我有这个密码: 这段代码可以工作,它将验证对象,并抛出一个异常消息,如下所示: CVC模式有效:值'123456789