Сделать minOccurs 1, чтобы сделать месяц обязательным;
Значение по умолчанию для minOccurs
равно единице, поэтому требуется элемент month
.Обратите внимание, как minOccurs="0"
необходимо было добавить к userLogin
, чтобы сделать его необязательным.
<xs:complexType name="wsData">
<xs:sequence>
<xs:element name="month" type="xs:string"/>
<xs:element minOccurs="0" name="userLogin" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Проверка месяца с его сгенерированным ограничением (без XmlAdapter).
Вы можете установить экземпляр Schema
в Unmarshaller, чтобы подтвердить ввод:
Демо
Следующий код может использоваться для генерации схемы XML:
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();
}
}
ОБНОВЛЕНИЕ
RI JAXB обычно выбрасывает ValidationEvent
серьезности 1 для проблем преобразования.Значение по умолчанию ValidationEventHandler
игнорирует все проблемы с серьезностью меньше 2. Это обычно приводит к тому, что значение устанавливается равным нулю.Вы можете переопределить ValidationEventHandler
следующим образом:
unmarshaller.setEventHandler(new ValidationEventHandler() {
@Override
public boolean handleEvent(ValidationEvent event) {
System.out.println(event);
return event.getSeverity() < ValidationEvent.ERROR;
}
});
Однако JAXB RI не отображает события, связанные с преобразованием значений перечисления (возможная ошибка).Если вы используете EclipseLink JAXB (MOXy) в качестве поставщика JAXB, вы получите исключение, например:
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)
Для получения дополнительной информации