How to get confirmation from JaXB?

I am trying to get a validation message in a variable with Jaxb. Example from here http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/api/javax/xml/bind/Unmarshaller.html

My code is:

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); } } 

But nothing happens. What am I doing wrong?

+4
source share
1 answer

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. 
+8
source

Source: https://habr.com/ru/post/1432653/


All Articles