2011-07-14 3 views
4

JaxB lors de la liaison d'un format de date incorrect à XMLGregorianCalendar ne déclenche pas d'exception. Au lieu de cela, il affecte null. Quel pourrait être le problème?La liaison JaxB XMLGregorianCalendar

@XmlAttribute(name = "travelEndDate", required = true) 
@XmlSchemaType(name = "date") 
protected XMLGregorianCalendar travelEndDate; 

<xs:complexType name="SearchCriteria"> 
<xs:attribute name="travelStartDate" type="xs:date" use="required"/> 
<xs:attribute name="travelEndDate" type="xs:date" use="required"/> 
</xs:complexType> 

Répondre

4

Note: Je suis EclipseLink JAXB (MOXy) plomb, et un membre du groupe d'experts JAXB 2.X (JSR-222).

Ce comportement variera un peu entre les implémentations JAXB. Moxy par exemple va jeter l'exception suivante si la valeur est incorrecte:

Exception in thread "main" javax.xml.bind.UnmarshalException 
- with linked exception: 
[Exception [EclipseLink-3003] (Eclipse Persistence Services - 2.4.0.qualifier): org.eclipse.persistence.exceptions.ConversionException 
Exception Description: Incorrect date format: [2011-02-50] (expected [YYYY-MM-DD])] 
    at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:225) 
    at forum254.Demo.main(Demo.java:18) 
Caused by: Exception [EclipseLink-3003] (Eclipse Persistence Services - 2.4.0.qualifier): org.eclipse.persistence.exceptions.ConversionException 
Exception Description: Incorrect date format: [2011-02-50] (expected [YYYY-MM-DD]) 
    at org.eclipse.persistence.exceptions.ConversionException.incorrectDateFormat(ConversionException.java:103) 
    at org.eclipse.persistence.internal.oxm.XMLConversionManager.convertStringToXMLGregorianCalendar(XMLConversionManager.java:689) 
    at org.eclipse.persistence.internal.oxm.XMLConversionManager.convertObjectToXMLGregorianCalendar(XMLConversionManager.java:278) 
    at org.eclipse.persistence.internal.oxm.XMLConversionManager.convertObject(XMLConversionManager.java:249) 
    at org.eclipse.persistence.oxm.XMLField.convertValueBasedOnSchemaType(XMLField.java:712) 

Solution

Pour obtenir une erreur signalée sur toute mise en œuvre de JAXB vous pouvez définir un schéma XML sur le unmarshaller pour effectuer la validation:

Vous pouvez également mettre en œuvre un XmlAdapter pour contrôler la conversion (et lancer une exception si nécessaire) vous:

0

Utilisez ce, il va attraper l'exception:

try { 
    String date = "your date here" 
    XMLGregorianCalendar xmlGCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(date); 
    } catch (DatatypeConfigurationException ex) { 
     //DO STUFF 
     } 

Mise à jour:

Après votre ajout de code, je ne sais pas comment vous attraper cela. Pour cela, je pense que vous devrez faire une vérification nulle et faire ce que vous voulez.

Questions connexes