@Test @SpecAssertions({ @SpecAssertion(section = "6.11", id = "a"), @SpecAssertion(section = "6.11", id = "b"), @SpecAssertion(section = "6.11", id = "d") }) public void testAnnotationAndMapParametersReflectParameterOverriding() { ConstraintDescriptor<?> descriptor = getConstraintDescriptor(Person.class, "firstName"); Set<ConstraintDescriptor<?>> composingDescriptors = descriptor.getComposingConstraints(); assertEquals(composingDescriptors.size(), 2, "Wrong number of composing constraints"); boolean hasSize = false; for (ConstraintDescriptor<?> desc : composingDescriptors) { if (desc.getAnnotation().annotationType().equals(Size.class)) { hasSize = true; Size sizeAnn = (Size) desc.getAnnotation(); assertEquals(sizeAnn.min(), 5, "The min parameter should reflect the overridden parameter"); assertEquals( desc.getAttributes().get("min"), 5, "The min parameter should reflect the overridden parameter"); } else if (desc.getAnnotation().annotationType().equals(NotNull.class)) { } else { fail("Unexpected annotation."); } } assertTrue(hasSize, "Size composed annotation not found"); }
/** * Process the given JSR-303 ConstraintViolations, adding corresponding errors to the provided * Spring {@link Errors} object. * * @param violations the JSR-303 ConstraintViolation results * @param errors the Spring errors object to register to */ protected void processConstraintViolations( Set<ConstraintViolation<Object>> violations, Errors errors) { for (ConstraintViolation<Object> violation : violations) { String field = violation.getPropertyPath().toString(); FieldError fieldError = errors.getFieldError(field); if (fieldError == null || !fieldError.isBindingFailure()) { try { ConstraintDescriptor<?> cd = violation.getConstraintDescriptor(); String errorCode = cd.getAnnotation().annotationType().getSimpleName(); Object[] errorArgs = getArgumentsForConstraint(errors.getObjectName(), field, cd); if (errors instanceof BindingResult) { // Can do custom FieldError registration with invalid value from ConstraintViolation, // as necessary for Hibernate Validator compatibility (non-indexed set path in field) BindingResult bindingResult = (BindingResult) errors; String nestedField = bindingResult.getNestedPath() + field; if ("".equals(nestedField)) { String[] errorCodes = bindingResult.resolveMessageCodes(errorCode); bindingResult.addError( new ObjectError( errors.getObjectName(), errorCodes, errorArgs, violation.getMessage())); } else { Object invalidValue = violation.getInvalidValue(); if (!"".equals(field) && (invalidValue == violation.getLeafBean() || (field.contains(".") && !field.contains("[]")))) { // Possibly a bean constraint with property path: retrieve the actual property // value. // However, explicitly avoid this for "address[]" style paths that we can't handle. invalidValue = bindingResult.getRawFieldValue(field); } String[] errorCodes = bindingResult.resolveMessageCodes(errorCode, field); bindingResult.addError( new FieldError( errors.getObjectName(), nestedField, invalidValue, false, errorCodes, errorArgs, violation.getMessage())); } } else { // got no BindingResult - can only do standard rejectValue call // with automatic extraction of the current field value errors.rejectValue(field, errorCode, errorArgs, violation.getMessage()); } } catch (NotReadablePropertyException ex) { throw new IllegalStateException( "JSR-303 validated property '" + field + "' does not have a corresponding accessor for Spring data binding - " + "check your DataBinder's configuration (bean property versus direct field access)", ex); } } } }
/* * Helper method that checks for unitActive's annotation. */ private boolean checkForB2BUnitActiveAnnotation( final Set<HybrisConstraintViolation> constraintViolations) { for (final Iterator constraintIterator = constraintViolations.iterator(); constraintIterator.hasNext(); ) { final HybrisConstraintViolation hybrisConstraintViolation = (HybrisConstraintViolation) constraintIterator.next(); final ConstraintViolation constraintViolation = hybrisConstraintViolation.getConstraintViolation(); final ConstraintDescriptor descriptor = constraintViolation.getConstraintDescriptor(); final Annotation annotation = descriptor.getAnnotation(); if (annotation.getClass().getName().equals("B2BUnitActive")) { constraintViolations.remove(hybrisConstraintViolation); return true; } } return false; }