What's the purpose of minOccurs, nillable and restriction?

后端 未结 5 1797
故里飘歌
故里飘歌 2021-02-02 13:44

Documentation for required says:

If required() is true, then Javabean property is mapped to an XML schema ele

5条回答
  •  爱一瞬间的悲伤
    2021-02-02 14:32

    Make minOccurs 1, to make month required;

    The default value for minOccurs is one, so the month element is required. Note how minOccurs="0" had to be added to userLogin to make it optional.

    
      
        
        
      
    
    

    Validate month with its generated restriction (without a XmlAdapter).

    You can set an instance of Schema on the Unmarshaller to have the input validated:

    • http://blog.bdoughan.com/2010/12/jaxb-and-marshalunmarshal-schema.html

    Demo

    The following code can be used to generate the XML schema:

    package forum9111936;
    
    import java.io.IOException;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.SchemaOutputResolver;
    import javax.xml.transform.Result;
    import javax.xml.transform.stream.StreamResult;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(WSData.class);
            SchemaOutputResolver sor = new SchemaOutputResolver() {
    
                @Override
                public Result createOutput(String namespaceUri,
                        String suggestedFileName) throws IOException {
                    StreamResult result = new StreamResult(System.out);
                    result.setSystemId(suggestedFileName);
                    return result;
                }
    
            };
            jc.generateSchema(sor);
            System.out.println();
        }
    
    }
    

    UPDATE

    The JAXB RI normally throws a ValidationEvent of severity 1 for conversion issues. The default ValidationEventHandler ignores all issues of severity less than 2. This normally results in the value being set to null. You can override the ValidationEventHandler as follows:

        unmarshaller.setEventHandler(new ValidationEventHandler() {
            @Override
            public boolean handleEvent(ValidationEvent event) {
                System.out.println(event);
                return event.getSeverity() < ValidationEvent.ERROR;
            }
        });
    

    However the JAXB RI does not appear to throw events related to converting enum values (possible bug). If you happen to be using EclipseLink JAXB (MOXy) as your JAXB provider then you will get an exception like:

    Exception in thread "main" Local Exception Stack: 
    Exception [EclipseLink-116] (Eclipse Persistence Services - 2.4.0.qualifier): org.eclipse.persistence.exceptions.DescriptorException
    Exception Description: No conversion value provided for the value [13] in field [month/text()].
    Mapping: org.eclipse.persistence.oxm.mappings.XMLDirectMapping[month-->month/text()]
    Descriptor: XMLDescriptor(forum9111936.WSData --> [])
        at org.eclipse.persistence.exceptions.DescriptorException.noFieldValueConversionToAttributeValueProvided(DescriptorException.java:1052)
        at org.eclipse.persistence.mappings.converters.ObjectTypeConverter.convertDataValueToObjectValue(ObjectTypeConverter.java:140)
        at org.eclipse.persistence.oxm.mappings.XMLDirectMapping.getAttributeValue(XMLDirectMapping.java:287)
        at org.eclipse.persistence.internal.oxm.XMLDirectMappingNodeValue.endElement(XMLDirectMappingNodeValue.java:190)
        at org.eclipse.persistence.oxm.record.UnmarshalRecord.endElement(UnmarshalRecord.java:910)
        at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parseEvent(XMLStreamReaderReader.java:133)
        at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parse(XMLStreamReaderReader.java:83)
        at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parse(XMLStreamReaderReader.java:72)
        at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:838)
        at org.eclipse.persistence.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:626)
        at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:472)
        at forum9111936.Demo2.main(Demo2.java:30)
    

    For More Information

    • http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html

提交回复
热议问题