以下内容应有所帮助:
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.*;@XmlRootElementpublic 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.



