The following is help:
JAXB2ValidationEventCollector
ValidationEventCollector came from JAXB 1 (JSR-31) and does not seem to support the changes we made for validation in JAXB 2 (JSR-222) very well. You can solve this problem by creating a subclass of ValidationEventHandler as follows.
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; } }
Example
The following example can be used to prove that everything works.
Customer
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; } }
Phone number
package forum12295028; public class PhoneNumber { }
customer.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>
Demo
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); } } } }
Output
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.
source share