@Override public void intercept(InterceptorStack stack, ControllerMethod method, Object instance) throws InterceptionException { try { stack.next(method, instance); } catch (Exception e) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); Throwable cause = e.getCause(); if (cause != null) { if (cause instanceof ConstraintViolationException) { Set<ConstraintViolation<?>> constraintViolations = ((ConstraintViolationException) cause).getConstraintViolations(); pw.printf("\nConstraint Violations: \n"); for (ConstraintViolation<?> constraintViolation : constraintViolations) { pw.printf("\t" + constraintViolation.getConstraintDescriptor().getAnnotation() + "\n"); } pw.printf("\n"); log.error(sw.toString()); } cause.printStackTrace(pw); } else { e.printStackTrace(pw); } pw.close(); result.include("stacktrace", sw.toString()); throw e; } }
/* * (non-Javadoc) * * @see com.vaadin.data.Validator#validate(java.lang.Object) */ @Override public void validate(final Object value) throws InvalidValueException { Set<?> violations = getJavaxBeanValidator().validateValue(beanClass, propertyName, value); if (violations.size() > 0) { List<String> exceptions = new ArrayList<String>(); for (Object v : violations) { final ConstraintViolation<?> violation = (ConstraintViolation<?>) v; String msg = getJavaxBeanValidatorFactory() .getMessageInterpolator() .interpolate( violation.getMessageTemplate(), new SimpleContext(value, violation.getConstraintDescriptor()), locale); exceptions.add(msg); } StringBuilder b = new StringBuilder(); for (int i = 0; i < exceptions.size(); i++) { if (i != 0) { b.append("<br/>"); } b.append(exceptions.get(i)); } throw new InvalidValueException(b.toString()); } }
protected boolean jsr303ValidateBean(T bean) { try { if (javaxBeanValidator == null) { javaxBeanValidator = getJavaxBeanValidatorFactory().getValidator(); } } catch (Throwable t) { // This may happen without JSR303 validation framework Logger.getLogger(getClass().getName()).fine("JSR303 validation failed"); return true; } Set<ConstraintViolation<T>> constraintViolations = new HashSet(javaxBeanValidator.validate(bean, getValidationGroups())); if (constraintViolations.isEmpty()) { return true; } Iterator<ConstraintViolation<T>> iterator = constraintViolations.iterator(); while (iterator.hasNext()) { ConstraintViolation<T> constraintViolation = iterator.next(); Class<? extends Annotation> annotationType = constraintViolation.getConstraintDescriptor().getAnnotation().annotationType(); AbstractComponent errortarget = validatorToErrorTarget.get(annotationType); if (errortarget != null) { // user has declared a target component for this constraint errortarget.setComponentError(new UserError(constraintViolation.getMessage())); iterator.remove(); } // else leave as "bean level error" } this.jsr303beanLevelViolations = constraintViolations; return false; }
/** * 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); } } } }
private void validateFixture(IFixture fixture, Validator validator) { Set<ConstraintViolation<IFixture>> violations = validator.validate(fixture); for (ConstraintViolation<IFixture> violation : violations) { if (violation.getLeafBean() instanceof ICompetition && "detail.competition.name".equals(violation.getPropertyPath().toString())) { assertEquals(violation.getLeafBean(), fixture.getCompetition()); Annotation annotation = violation.getConstraintDescriptor().getAnnotation(); assertEquals(annotation.annotationType(), NotNull.class); return; } } fail("@NotNull constraint violation for 'detail.competition.name' not detected"); }
/* * 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; }
/** * When dealing with @ValidateWith annotations, and message parameter is not used in the * annotation, extract the message from validator's getErrorMessageKey() method */ protected String getMessageForConstraintViolation(ConstraintViolation<Object> violation) { String errorMessage = violation.getMessage(); Annotation annotation = violation.getConstraintDescriptor().getAnnotation(); if (annotation instanceof Constraints.ValidateWith) { Constraints.ValidateWith validateWithAnnotation = (Constraints.ValidateWith) annotation; if (violation.getMessage().equals(Constraints.ValidateWithValidator.defaultMessage)) { Constraints.ValidateWithValidator validateWithValidator = new Constraints.ValidateWithValidator(); validateWithValidator.initialize(validateWithAnnotation); Tuple<String, Object[]> errorMessageKey = validateWithValidator.getErrorMessageKey(); if (errorMessageKey != null && errorMessageKey._1 != null) { errorMessage = errorMessageKey._1; } } } return errorMessage; }
private String getMessage( Member member, Object[] args, Set<? extends ConstraintViolation<?>> violations) { StringBuilder message = new StringBuilder(); message.append(violations.size()); message.append(" constraint violation(s) occurred during method validation."); message.append("\nConstructor or Method: "); message.append(member); message.append("\nArgument values: "); message.append(Arrays.toString(args)); message.append("\nConstraint violations: "); int i = 1; for (ConstraintViolation<?> constraintViolation : violations) { Path.Node leafNode = getLeafNode(constraintViolation); message.append("\n ("); message.append(i); message.append(")"); message.append(" Kind: "); message.append(leafNode.getKind()); if (leafNode.getKind() == ElementKind.PARAMETER) { message.append("\n parameter index: "); message.append(leafNode.as(Path.ParameterNode.class).getParameterIndex()); } message.append("\n message: "); message.append(constraintViolation.getMessage()); message.append("\n root bean: "); message.append(constraintViolation.getRootBean()); message.append("\n property path: "); message.append(constraintViolation.getPropertyPath()); message.append("\n constraint: "); message.append(constraintViolation.getConstraintDescriptor().getAnnotation()); i++; } return message.toString(); }
public void init() { int from = 0; int to = 10; data = cartRepository .findAll(new org.springframework.data.domain.PageRequest(from / to, to)) .getContent(); if (data == null) { throw new IllegalStateException( "Find entries implementation for 'Cart' illegally returned null"); } if (!data.isEmpty()) { return; } data = new ArrayList<Cart>(); for (int i = 0; i < 10; i++) { Cart obj = getNewTransientCart(i); try { cartRepository.save(obj); } catch (ConstraintViolationException e) { StringBuilder msg = new StringBuilder(); for (Iterator<ConstraintViolation<?>> iter = e.getConstraintViolations().iterator(); iter.hasNext(); ) { ConstraintViolation<?> cv = iter.next(); msg.append("[") .append(cv.getConstraintDescriptor()) .append(":") .append(cv.getMessage()) .append("=") .append(cv.getInvalidValue()) .append("]"); } throw new RuntimeException(msg.toString(), e); } cartRepository.flush(); data.add(obj); } }
/* * (non-Javadoc) * * @see com.vaadin.data.Validator#validate(java.lang.Object) */ @Override public void validate(final Object value) throws InvalidValueException { Set<?> violations = getJavaxBeanValidator().validateValue(beanClass, propertyName, value); if (violations.size() > 0) { InvalidValueException[] causes = new InvalidValueException[violations.size()]; int i = 0; for (Object v : violations) { final ConstraintViolation<?> violation = (ConstraintViolation<?>) v; String msg = getJavaxBeanValidatorFactory() .getMessageInterpolator() .interpolate( violation.getMessageTemplate(), new SimpleContext(value, violation.getConstraintDescriptor()), locale); causes[i] = new InvalidValueException(msg); ++i; } throw new InvalidValueException(null, causes); } }
public void init() { int from = 0; int to = 10; data = pizzaService.findPizzaEntries(from, to); if (data == null) { throw new IllegalStateException( "Find entries implementation for 'Pizza' illegally returned null"); } if (!data.isEmpty()) { return; } data = new ArrayList<Pizza>(); for (int i = 0; i < 10; i++) { Pizza obj = getNewTransientPizza(i); try { pizzaService.savePizza(obj); } catch (ConstraintViolationException e) { StringBuilder msg = new StringBuilder(); for (Iterator<ConstraintViolation<?>> iter = e.getConstraintViolations().iterator(); iter.hasNext(); ) { ConstraintViolation<?> cv = iter.next(); msg.append("[") .append(cv.getConstraintDescriptor()) .append(":") .append(cv.getMessage()) .append("=") .append(cv.getInvalidValue()) .append("]"); } throw new RuntimeException(msg.toString(), e); } pizzaRepository.flush(); data.add(obj); } }
/** * Binds data to this form - that is, handles form submission. * * @param data data to submit * @return a copy of this form filled with the new data */ @SuppressWarnings("unchecked") public Form<T> bind(Map<String, String> data, String... allowedFields) { DataBinder dataBinder; Map<String, String> objectData = data; if (rootName == null) { dataBinder = new DataBinder(blankInstance()); } else { dataBinder = new DataBinder(blankInstance(), rootName); objectData = new HashMap<>(); for (String key : data.keySet()) { if (key.startsWith(rootName + ".")) { objectData.put(key.substring(rootName.length() + 1), data.get(key)); } } } if (allowedFields.length > 0) { dataBinder.setAllowedFields(allowedFields); } SpringValidatorAdapter validator = new SpringValidatorAdapter(play.data.validation.Validation.getValidator()); dataBinder.setValidator(validator); dataBinder.setConversionService(formatters.conversion); dataBinder.setAutoGrowNestedPaths(true); final Map<String, String> objectDataFinal = objectData; withRequestLocale( () -> { dataBinder.bind(new MutablePropertyValues(objectDataFinal)); return null; }); Set<ConstraintViolation<Object>> validationErrors; if (groups != null) { validationErrors = validator.validate(dataBinder.getTarget(), groups); } else { validationErrors = validator.validate(dataBinder.getTarget()); } BindingResult result = dataBinder.getBindingResult(); for (ConstraintViolation<Object> violation : validationErrors) { String field = violation.getPropertyPath().toString(); FieldError fieldError = result.getFieldError(field); if (fieldError == null || !fieldError.isBindingFailure()) { try { result.rejectValue( field, violation.getConstraintDescriptor().getAnnotation().annotationType().getSimpleName(), getArgumentsForConstraint( result.getObjectName(), field, violation.getConstraintDescriptor()), getMessageForConstraintViolation(violation)); } catch (NotReadablePropertyException ex) { throw new IllegalStateException( "JSR-303 validated property '" + field + "' does not have a corresponding accessor for data binding - " + "check your DataBinder's configuration (bean property versus direct field access)", ex); } } } if (result.hasErrors() || result.getGlobalErrorCount() > 0) { Map<String, List<ValidationError>> errors = new HashMap<>(); for (FieldError error : result.getFieldErrors()) { String key = error.getObjectName() + "." + error.getField(); if (key.startsWith("target.") && rootName == null) { key = key.substring(7); } if (!errors.containsKey(key)) { errors.put(key, new ArrayList<>()); } ValidationError validationError; if (error.isBindingFailure()) { ImmutableList.Builder<String> builder = ImmutableList.builder(); Optional<Messages> msgs = Optional.of(Http.Context.current.get()).map(c -> messagesApi.preferred(c.request())); for (String code : error.getCodes()) { code = code.replace("typeMismatch", "error.invalid"); if (!msgs.isPresent() || msgs.get().isDefinedAt(code)) { builder.add(code); } } validationError = new ValidationError( key, builder.build().reverse(), convertErrorArguments(error.getArguments())); } else { validationError = new ValidationError( key, error.getDefaultMessage(), convertErrorArguments(error.getArguments())); } errors.get(key).add(validationError); } List<ValidationError> globalErrors = new ArrayList<>(); for (ObjectError error : result.getGlobalErrors()) { globalErrors.add( new ValidationError( "", error.getDefaultMessage(), convertErrorArguments(error.getArguments()))); } if (!globalErrors.isEmpty()) { errors.put("", globalErrors); } return new Form( rootName, backedType, data, errors, Optional.empty(), groups, messagesApi, formatters); } else { Object globalError = null; if (result.getTarget() != null) { try { java.lang.reflect.Method v = result.getTarget().getClass().getMethod("validate"); globalError = v.invoke(result.getTarget()); } catch (NoSuchMethodException e) { // do nothing } catch (Throwable e) { throw new RuntimeException(e); } } if (globalError != null) { Map<String, List<ValidationError>> errors = new HashMap<>(); if (globalError instanceof String) { errors.put("", new ArrayList<>()); errors.get("").add(new ValidationError("", (String) globalError, new ArrayList())); } else if (globalError instanceof List) { for (ValidationError error : (List<ValidationError>) globalError) { List<ValidationError> errorsForKey = errors.get(error.key()); if (errorsForKey == null) { errors.put(error.key(), errorsForKey = new ArrayList<>()); } errorsForKey.add(error); } } else if (globalError instanceof Map) { errors = (Map<String, List<ValidationError>>) globalError; } return new Form( rootName, backedType, data, errors, Optional.empty(), groups, messagesApi, formatters); } return new Form( rootName, backedType, new HashMap<>(data), new HashMap<>(errors), Optional.ofNullable((T) result.getTarget()), groups, messagesApi, formatters); } }
public static BeanValidatorContext of(ConstraintViolation<Object> violation) { return new BeanValidatorContext( violation.getConstraintDescriptor(), violation.getInvalidValue()); }
/** * Binds data to this form - that is, handles form submission. * * @param data data to submit * @return a copy of this form filled with the new data */ public Form<T> bind(Map<String, String> data, String... allowedFields) { DataBinder dataBinder = null; Map<String, String> objectData = data; if (rootName == null) { dataBinder = new DataBinder(blankInstance()); } else { dataBinder = new DataBinder(blankInstance(), rootName); objectData = new HashMap<String, String>(); for (String key : data.keySet()) { if (key.startsWith(rootName + ".")) { objectData.put(key.substring(rootName.length() + 1), data.get(key)); } } } if (allowedFields.length > 0) { dataBinder.setAllowedFields(allowedFields); } SpringValidatorAdapter validator = new SpringValidatorAdapter(play.data.validation.Validation.getValidator()); dataBinder.setValidator(validator); dataBinder.setConversionService(play.data.format.Formatters.conversion); dataBinder.setAutoGrowNestedPaths(true); dataBinder.bind(new MutablePropertyValues(objectData)); Set<ConstraintViolation<Object>> validationErrors; if (groups != null) { validationErrors = validator.validate(dataBinder.getTarget(), groups); } else { validationErrors = validator.validate(dataBinder.getTarget()); } BindingResult result = dataBinder.getBindingResult(); for (ConstraintViolation<Object> violation : validationErrors) { String field = violation.getPropertyPath().toString(); FieldError fieldError = result.getFieldError(field); if (fieldError == null || !fieldError.isBindingFailure()) { try { result.rejectValue( field, violation.getConstraintDescriptor().getAnnotation().annotationType().getSimpleName(), getArgumentsForConstraint( result.getObjectName(), field, violation.getConstraintDescriptor()), violation.getMessage()); } catch (NotReadablePropertyException ex) { throw new IllegalStateException( "JSR-303 validated property '" + field + "' does not have a corresponding accessor for data binding - " + "check your DataBinder's configuration (bean property versus direct field access)", ex); } } } if (result.hasErrors()) { Map<String, List<ValidationError>> errors = new HashMap<String, List<ValidationError>>(); for (FieldError error : result.getFieldErrors()) { String key = error.getObjectName() + "." + error.getField(); if (key.startsWith("target.") && rootName == null) { key = key.substring(7); } List<Object> arguments = new ArrayList<Object>(); for (Object arg : error.getArguments()) { if (!(arg instanceof org.springframework.context.support.DefaultMessageSourceResolvable)) { arguments.add(arg); } } if (!errors.containsKey(key)) { errors.put(key, new ArrayList<ValidationError>()); } errors .get(key) .add( new ValidationError( key, error.isBindingFailure() ? "error.invalid" : error.getDefaultMessage(), arguments)); } return new Form(rootName, backedType, data, errors, None(), groups); } else { Object globalError = null; if (result.getTarget() != null) { try { java.lang.reflect.Method v = result.getTarget().getClass().getMethod("validate"); globalError = v.invoke(result.getTarget()); } catch (NoSuchMethodException e) { } catch (Throwable e) { throw new RuntimeException(e); } } if (globalError != null) { Map<String, List<ValidationError>> errors = new HashMap<String, List<ValidationError>>(); if (globalError instanceof String) { errors.put("", new ArrayList<ValidationError>()); errors.get("").add(new ValidationError("", (String) globalError, new ArrayList())); } else if (globalError instanceof List) { errors.put("", (List<ValidationError>) globalError); } else if (globalError instanceof Map) { errors = (Map<String, List<ValidationError>>) globalError; } return new Form(rootName, backedType, data, errors, None(), groups); } return new Form( rootName, backedType, new HashMap<String, String>(data), new HashMap<String, List<ValidationError>>(errors), Some((T) result.getTarget()), groups); } }