2011-09-27 53 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); 
       } 
      } 

     }