@Override @SuppressWarnings("unchecked") public void afterPropertiesSet() throws Exception { Assert.state(yaml != null, "Yaml document should not be null"); Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); try { logger.trace("Yaml document is\n" + yaml); configuration = (T) (new Yaml(constructor)).load(yaml); Set<ConstraintViolation<T>> errors = validator.validate(configuration); if (!errors.isEmpty()) { logger.error("YAML configuration failed validation"); for (ConstraintViolation<?> error : errors) { logger.error(error.getPropertyPath() + ": " + error.getMessage()); } if (exceptionIfInvalid) { @SuppressWarnings("rawtypes") ConstraintViolationException summary = new ConstraintViolationException((Set) errors); throw summary; } } } catch (YAMLException e) { if (exceptionIfInvalid) { throw e; } } }
/** * Validate the given value. * * @param value The value, may be null * @param field The name of the field being validated, if applicable * @param context The Ninja request context */ @Override public void validate(Object value, String field, Context context) { if (value != null) { final ValidatorFactory validatorFactory = javax.validation.Validation.buildDefaultValidatorFactory(); final javax.validation.Validator validator = validatorFactory.getValidator(); final Set<javax.validation.ConstraintViolation<Object>> violations = validator.validate(value); final Locale localeToUse = this.requestLanguage.getLocaleFromStringOrDefault(this.requestLanguage.getLanguage(context, Optional.<Result>empty())); final Validation validation = context.getValidation(); for (final javax.validation.ConstraintViolation<Object> violation : violations) { final String violationMessage = validatorFactory.getMessageInterpolator().interpolate( violation.getMessageTemplate(), new NinjaContextMsgInterpolator(value, violation.getConstraintDescriptor()), localeToUse ); final String messageKey = violation.getMessageTemplate().replaceAll("[{}]", ""); final ConstraintViolation constraintViolation = new ConstraintViolation( messageKey, violation.getPropertyPath().toString(), violationMessage, violation.getInvalidValue()); validation.addViolation(constraintViolation); } } }
final Set<ConstraintViolation<T>> violations = validator.validate(config); if (!violations.isEmpty()) { List<String> messages = new ArrayList<>(); StringBuilder path = new StringBuilder(); try { Class<?> beanClazz = violation.getRootBeanClass(); final Iterator<Path.Node> iter = violation.getPropertyPath().iterator(); while (iter.hasNext()) { Path.Node next = iter.next(); if (next.getKind() == ElementKind.PROPERTY) { final String fieldName = next.getName(); final Field theField = beanClazz.getDeclaredField(fieldName); messages.add(StringUtils.format("%s - %s", path.toString(), violation.getMessage()));
public static <T> String format(ConstraintViolation<T> v) { if (v.getConstraintDescriptor().getAnnotation() instanceof ValidationMethod) { return v.getMessage(); } else { return String.format("%s %s", v.getPropertyPath(), v.getMessage()); } }
protected Response handleConstraintViolationException(ConstraintViolationException cve) { ViolationReport report = new ViolationReport(); for (ConstraintViolation cv : cve.getConstraintViolations()) { report.addConstraintViolation(new RestConstraintViolation( cv.getPropertyPath().toString(), cv.getMessage(), cv.getInvalidValue() == null ? "null" : cv.getInvalidValue().toString())); } // TODO for now just do xml output return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(report).type(ContentType.TEXT_XML_UTF_8).build(); } }
private static String toString(Set<? extends ConstraintViolation<?>> constraintViolations) { return constraintViolations.stream() .map( cv -> cv == null ? "null" : cv.getPropertyPath() + ": " + cv.getMessage() ) .collect( Collectors.joining( ", " ) ); } }
@Test public void testWorkflowTaskTypeHTTPWithHttpParamMissing() { WorkflowTask workflowTask = createSampleWorkflowTask(); workflowTask.setType("HTTP"); ConstraintMapping mapping = config.createConstraintMapping(); mapping.type(WorkflowTask.class) .constraint(new WorkflowTaskTypeConstraintDef()); Validator validator = config.addMapping(mapping) .buildValidatorFactory() .getValidator(); when(mockMetadataDao.getTaskDef(anyString())).thenReturn(new TaskDef()); Set<ConstraintViolation<WorkflowTask>> result = validator.validate(workflowTask); assertEquals(1, result.size()); List<String> validationErrors = new ArrayList<>(); result.forEach(e -> validationErrors.add(e.getMessage())); assertTrue(validationErrors.contains("inputParameters.http_request field is required for taskType: HTTP taskName: encode")); }
/** * Perform validation of the given bean. * @param bean the bean instance to validate * @see javax.validation.Validator#validate */ protected void doValidate(Object bean) { Assert.state(this.validator != null, "No Validator set"); Object objectToValidate = AopProxyUtils.getSingletonTarget(bean); if (objectToValidate == null) { objectToValidate = bean; } Set<ConstraintViolation<Object>> result = this.validator.validate(objectToValidate); if (!result.isEmpty()) { StringBuilder sb = new StringBuilder("Bean state is invalid: "); for (Iterator<ConstraintViolation<Object>> it = result.iterator(); it.hasNext();) { ConstraintViolation<Object> violation = it.next(); sb.append(violation.getPropertyPath()).append(" - ").append(violation.getMessage()); if (it.hasNext()) { sb.append("; "); } } throw new BeanInitializationException(sb.toString()); } }
private static <T> String formatMessage(Set<ConstraintViolation<T>> violations) { StringBuilder sb = new StringBuilder(); sb.append("Configuration task validation failed."); for (ConstraintViolation<T> violation : violations) { sb.append(" "); sb.append(violation.getPropertyPath()); sb.append(" "); sb.append(violation.getMessage()); sb.append(" but got "); sb.append(violation.getInvalidValue()); } return sb.toString(); } }
@Test public void testWorkflowTaskMissingReferenceName() { WorkflowTask workflowTask = createSampleWorkflowTask(); workflowTask.setTaskReferenceName(null); Set<ConstraintViolation<Object>> result = validator.validate(workflowTask); assertEquals(1, result.size()); assertEquals(result.iterator().next().getMessage(), "WorkflowTask taskReferenceName name cannot be empty or null"); }
@Override public Response toResponse(javax.validation.ValidationException e) { final StringBuilder strBuilder = new StringBuilder("[ValidationException] "); for (ConstraintViolation<?> cv : ((ConstraintViolationException) e).getConstraintViolations()) { strBuilder.append(cv.getPropertyPath().toString() + " " + cv.getMessage()); } CommonResultView resultView = CommonResultView.fail(400, 400, strBuilder.toString(), null); return Response.status(resultView.getStatus()) .type(MediaType.APPLICATION_JSON) .entity(resultView).build(); } }
Set<ConstraintViolation<?>> violations = ((ConstraintViolationException) cause).getConstraintViolations(); ConstraintViolation<?> v = it.next(); sb.append(v.getRootBeanClass().getSimpleName()); sb.append("."); sb.append(v.getPropertyPath()); sb.append(" ("); sb.append(v.getMessage()); sb.append(")");
@Test public void testSimpleValidationWithClassLevel() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.afterPropertiesSet(); ValidPerson person = new ValidPerson(); person.setName("Juergen"); person.getAddress().setStreet("Juergen's Street"); Set<ConstraintViolation<ValidPerson>> result = validator.validate(person); assertEquals(1, result.size()); Iterator<ConstraintViolation<ValidPerson>> iterator = result.iterator(); ConstraintViolation<?> cv = iterator.next(); assertEquals("", cv.getPropertyPath().toString()); assertTrue(cv.getConstraintDescriptor().getAnnotation() instanceof NameAddressValid); }
/** * Gets the human friendly location of where the violation was raised. */ public static String getMessage(ConstraintViolation<?> v, Invocable invocable) { final Pair<Path, ? extends ConstraintDescriptor<?>> of = Pair.of(v.getPropertyPath(), v.getConstraintDescriptor()); final String cachePrefix = PREFIX_CACHE.getIfPresent(of); if (cachePrefix == null) { final String prefix = calculatePrefix(v, invocable); PREFIX_CACHE.put(of, prefix); return prefix + v.getMessage(); } return cachePrefix + v.getMessage(); }
/** * Gets the method return value name, if the violation is raised in it */ private static Optional<String> getMethodReturnValueName(ConstraintViolation<?> violation) { int returnValueNames = -1; final StringBuilder result = new StringBuilder("server response"); for (Path.Node node : violation.getPropertyPath()) { if (node.getKind().equals(ElementKind.RETURN_VALUE)) { returnValueNames = 0; } else if (returnValueNames >= 0) { result.append(returnValueNames++ == 0 ? " " : ".").append(node); } } return returnValueNames >= 0 ? Optional.of(result.toString()) : Optional.empty(); }
String msg = "property " + violation.getPropertyPath(); msg += " in " + violation.getRootBeanClass(); msg += " " + violation.getMessage(); sortedViolations.add(msg);
private ViolationExpectation(ConstraintViolation<?> violation, ViolationExpectationPropertiesToTest propertiesToTest) { this.constraintType = violation.getConstraintDescriptor().getAnnotation().annotationType(); if ( propertiesToTest.testRootBeanClass ) { withRootBeanClass( violation.getRootBeanClass() ); } if ( propertiesToTest.testMessage ) { withMessage( violation.getMessage() ); } if ( propertiesToTest.testInvalidValue ) { withInvalidValue( violation.getInvalidValue() ); } if ( propertiesToTest.testPropertyPath ) { withPropertyPath( new PathExpectation( violation.getPropertyPath() ) ); } }
if (cv1.getMessage() != null ? !cv1.getMessage().equals(cv2.getMessage()) : cv2.getMessage() != null) if (cv1.getPropertyPath() != null ? !comparePropertyPath(cv1.getPropertyPath(), cv2.getPropertyPath()) : cv2.getPropertyPath() != null) if (cv1.getRootBeanClass() != null ? !compareClass(cv1.getRootBeanClass(), cv2.getRootBeanClass()) : cv2.getRootBeanClass() != null) if (cv1.getLeafBean() != null ? !compareClass(cv1.getLeafBean().getClass(), cv2.getLeafBean().getClass()) : cv2.getLeafBean() != null) if (cv1.getConstraintDescriptor() != null ? !cv1.getConstraintDescriptor().equals(cv2.getConstraintDescriptor()) : cv2.getConstraintDescriptor() != null) if (cv1.getConstraintDescriptor() instanceof ConstraintDescriptorImpl && cv2.getConstraintDescriptor() instanceof ConstraintDescriptorImpl) ConstraintDescriptorImpl<?> cdi1 = (ConstraintDescriptorImpl<?>) cv1.getConstraintDescriptor(); ConstraintDescriptorImpl<?> cdi2 = (ConstraintDescriptorImpl<?>) cv2.getConstraintDescriptor(); if (cdi1.getElementType() != null ? !cdi1.getElementType().equals(cdi2.getElementType()) : cdi2.getElementType() != null) { return false; if (cv1.getMessageTemplate() != null ? !cv1.getMessageTemplate().equals(cv2.getMessageTemplate()) : cv2.getMessageTemplate() != null) if (cv1.getInvalidValue() != null ? !cv1.getInvalidValue().equals(cv2.getInvalidValue()) : cv2.getInvalidValue() != null)
@Test public void testFailsValidation() { ConstrainedPowerOfTwo object = new ConstrainedPowerOfTwo(11); Set<ConstraintViolation<ConstrainedPowerOfTwo>> violations = VALIDATOR.validate(object); assertEquals(violations.size(), 2); for (ConstraintViolation<ConstrainedPowerOfTwo> violation : violations) { assertInstanceOf(violation.getConstraintDescriptor().getAnnotation(), PowerOfTwo.class); } }
public ConstraintViolationMessage(ConstraintViolation<?> violation, MessageSource msgSrc, Locale locale) { this.violation = violation; this.message = msgSrc.getMessage(violation.getMessageTemplate(), new Object[] { violation.getLeafBean().getClass().getSimpleName(), violation.getPropertyPath().toString(), violation.getInvalidValue() }, violation.getMessage(), locale); }