2011-09-27 80 views
3

所以,我回到你的另一個問題。我有一個JAXB對象,我正在使用XML文件進行編組/解組。將計數約束添加到@XmlElement?

的代碼是一樣的東西:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Line { 

    @XmlElement(required = true) 
    @Min(1) 
    private int quantity; 
... 

} 

我的XML結構爲:

<line> 
     <quantity>2</quantity> 
    </line> 

現在的Java代碼接受本太:

<line> 
     <quantity>2</quantity> 
     <quantity>2</quantity> 
    </line> 

所以,我應該怎麼編程我的約束,我只接受第一個XML而不是第二個。

再次感謝!

回答

3

您應該使用XSD並驗證您的xml。 我們必須使用與其版本相對應的xsd來驗證我們的xml文件:

 ValidationEventCollector vec = new ValidationEventCollector(); 

     SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

     URL xsdURL = getClass().getResource("/xsd/" + xsd); 
     Schema schema = sf.newSchema(xsdURL); 

     //You should change your jaxbContext here for your stuff.... 
     Unmarshaller um = (getJAXBContext(NotificationReponseEnum.NOTIFICATION, notificationWrapper.getEnteteNotification().getTypeNotification())) 
       .createUnmarshaller(); 
     um.setSchema(schema); 

     try { 

      StringReader reader = new StringReader(xml); 
      um.setEventHandler(vec); 
      um.unmarshal(reader); 

     } catch (javax.xml.bind.UnmarshalException ex) { 

      if (vec != null && vec.hasEvents()) { 
       erreurs = new ArrayList<MessageErreur>(); 
       for (ValidationEvent ve : vec.getEvents()) { 
        MessageErreur erreur = new MessageErreur(); 
        String msg = ve.getMessage(); 
        ValidationEventLocator vel = ve.getLocator(); 
        int numLigne = vel.getLineNumber(); 
        int numColonne = vel.getColumnNumber(); 
        erreur.setMessage(msg); 
        msgErreur.setCode(ve.getSeverity()) 
        erreur.setException(ve.getLinkedException()); 
        erreur.setPosition(numLigne, numColonne); 
        erreurs.add(erreur); 

        logger.debug("Erreur de validation xml" + "erreur : " + numLigne + "." + numColonne + ": " + msg); 
       } 
      } 

     }