Index: xml/src/main/java/org/exolab/castor/xml/Validator.java =================================================================== --- xml/src/main/java/org/exolab/castor/xml/Validator.java (revision 8617) +++ xml/src/main/java/org/exolab/castor/xml/Validator.java (revision ) @@ -188,7 +188,8 @@ public void checkUnresolvedIdrefs(ValidationContext context) throws ValidationException { if (context.getUnresolvedIdRefs().size() > 0) { - String err = MessageFormat.format(resourceBundle.getString("validator.error.class.descriptor.resolver.null"), new Object[] {context.getUnresolvedIdRefs().toString()}); + String err = MessageFormat.format(resourceBundle.getString("validator.error.unresolved.idref"), + new Object[] {context.getUnresolvedIdRefs().toString()}); throw new ValidationException(err); } } Index: xml/src/main/java/org/exolab/castor/xml/XMLMappingLoader.java =================================================================== --- xml/src/main/java/org/exolab/castor/xml/XMLMappingLoader.java (revision 8152) +++ xml/src/main/java/org/exolab/castor/xml/XMLMappingLoader.java (revision ) @@ -89,6 +89,7 @@ import org.exolab.castor.xml.util.XMLContainerElementFieldDescriptor; import org.exolab.castor.xml.util.XMLFieldDescriptorImpl; import org.exolab.castor.xml.validators.IdRefValidator; +import org.exolab.castor.xml.validators.IdValidator; import org.exolab.castor.xml.validators.NameValidator; /** @@ -281,7 +282,9 @@ FieldDescriptor xmlId = null; if (idList.size() != 0) { xmlId = (FieldDescriptor) idList.get(0); } - if (xmlId != null) { xmlClassDesc.setIdentity((XMLFieldDescriptorImpl) xmlId); } + if (xmlId != null) { + setClassIdentity(xmlClassDesc, (XMLFieldDescriptorImpl) xmlId); + } for (int i = 0; i < fieldList.size(); i++) { FieldDescriptor fieldDesc = (FieldDescriptor) fieldList.get(i); if (fieldDesc != null) { @@ -339,7 +342,7 @@ if (!isMatchFieldName(xmlFields2, introFields[i].getFieldName())) { // If there is no field with this name, we can add it if (introFields[i].getFieldName().equals(identity)) { - xmlClassDesc.setIdentity(introFields[i]); + setClassIdentity(xmlClassDesc, introFields[i]); } else { xmlClassDesc.addFieldDescriptor(introFields[i]); @@ -353,7 +356,7 @@ if (!isMatchFieldName(xmlFields2, introFields[i].getFieldName())) { // If there is no field with this name, we can add it if (introFields[i].getFieldName().equals(identity)) { - xmlClassDesc.setIdentity(introFields[i]); + setClassIdentity(xmlClassDesc, introFields[i]); } else { xmlClassDesc.addFieldDescriptor(introFields[i]); @@ -386,6 +389,15 @@ return xmlClassDesc; } + private void setClassIdentity(XMLClassDescriptorAdapter xmlClassDesc, XMLFieldDescriptor fieldDescriptor) { + xmlClassDesc.setIdentity(fieldDescriptor); + + // modified the validator used for this vield + FieldValidator fieldValidator = new FieldValidator(); + fieldValidator.setValidator(new IdValidator()); + ((XMLFieldDescriptorImpl)fieldDescriptor).setValidator(fieldValidator); + } + protected final FieldDescriptor findIdentityByName( final List fldList, final String idName, final Class javaClass) { for (int i = 0; i < fldList.size(); i++) { Index: xml/src/main/java/org/exolab/castor/xml/FieldValidator.java =================================================================== --- xml/src/main/java/org/exolab/castor/xml/FieldValidator.java (revision 8617) +++ xml/src/main/java/org/exolab/castor/xml/FieldValidator.java (revision ) @@ -52,6 +52,7 @@ import org.exolab.castor.mapping.FieldHandler; import org.exolab.castor.xml.location.XPathLocation; +import org.exolab.castor.xml.util.XMLFieldDescriptorImpl; /** * Handles field validation. @@ -223,6 +224,13 @@ return; } + if (((XMLFieldDescriptorImpl)_descriptor).isIdentity()) { + if (_validator != null) { + _validator.validate(value, context); + } + return; + } + // Prevent endless loop! Have we seen this object yet? if (context != null) { if (context.isValidated(object)) {