@Override public List<FieldError> getFieldErrors(String field) { List<FieldError> result = new LinkedList<>(); String fixedField = fixedField(field); for (ObjectError objectError : this.errors) { if (objectError instanceof FieldError && isMatchingFieldError(fixedField, (FieldError) objectError)) { result.add((FieldError) objectError); } } return Collections.unmodifiableList(result); }
@Override @Nullable public FieldError getFieldError(String field) { String fixedField = fixedField(field); for (ObjectError objectError : this.errors) { if (objectError instanceof FieldError) { FieldError fieldError = (FieldError) objectError; if (isMatchingFieldError(fixedField, fieldError)) { return fieldError; } } } return null; }
@Override public List<FieldError> getFieldErrors(String field) { List<FieldError> result = new LinkedList<>(); String fixedField = fixedField(field); for (ObjectError objectError : this.errors) { if (objectError instanceof FieldError && isMatchingFieldError(fixedField, (FieldError) objectError)) { result.add((FieldError) objectError); } } return Collections.unmodifiableList(result); }
@Override @Nullable public Object getRawFieldValue(String field) { return (getTarget() != null ? getActualFieldValue(fixedField(field)) : null); }
/** * This default implementation determines the type based on the actual * field value, if any. Subclasses should override this to determine * the type from a descriptor, even for {@code null} values. * @see #getActualFieldValue */ @Override @Nullable public Class<?> getFieldType(@Nullable String field) { if (getTarget() != null) { Object value = getActualFieldValue(fixedField(field)); if (value != null) { return value.getClass(); } } return this.fieldTypes.get(field); }
@Override @Nullable public FieldError getFieldError(String field) { String fixedField = fixedField(field); for (ObjectError objectError : this.errors) { if (objectError instanceof FieldError) { FieldError fieldError = (FieldError) objectError; if (isMatchingFieldError(fixedField, fieldError)) { return fieldError; } } } return null; }
/** * This implementation delegates to the * {@link #getPropertyEditorRegistry() PropertyEditorRegistry}'s * editor lookup facility, if available. */ @Override @Nullable public PropertyEditor findEditor(@Nullable String field, @Nullable Class<?> valueType) { PropertyEditorRegistry editorRegistry = getPropertyEditorRegistry(); if (editorRegistry != null) { Class<?> valueTypeToUse = valueType; if (valueTypeToUse == null) { valueTypeToUse = getFieldType(field); } return editorRegistry.findCustomEditor(valueTypeToUse, fixedField(field)); } else { return null; } }
@Override @Nullable public Object getRawFieldValue(String field) { return (getTarget() != null ? getActualFieldValue(fixedField(field)) : null); }
/** * This default implementation determines the type based on the actual * field value, if any. Subclasses should override this to determine * the type from a descriptor, even for {@code null} values. * @see #getActualFieldValue */ @Override @Nullable public Class<?> getFieldType(@Nullable String field) { if (getTarget() != null) { Object value = getActualFieldValue(fixedField(field)); if (value != null) { return value.getClass(); } } return this.fieldTypes.get(field); }
@Override public String[] resolveMessageCodes(String errorCode, @Nullable String field) { return getMessageCodesResolver().resolveMessageCodes( errorCode, getObjectName(), fixedField(field), getFieldType(field)); }
@Override public void rejectValue(@Nullable String field, String errorCode, @Nullable Object[] errorArgs, @Nullable String defaultMessage) { if ("".equals(getNestedPath()) && !StringUtils.hasLength(field)) { // We're at the top of the nested object hierarchy, // so the present level is not a field but rather the top object. // The best we can do is register a global error here... reject(errorCode, errorArgs, defaultMessage); return; } String fixedField = fixedField(field); Object newVal = getActualFieldValue(fixedField); FieldError fe = new FieldError(getObjectName(), fixedField, newVal, false, resolveMessageCodes(errorCode, field), errorArgs, defaultMessage); addError(fe); }
/** * This implementation delegates to the * {@link #getPropertyEditorRegistry() PropertyEditorRegistry}'s * editor lookup facility, if available. */ @Override @Nullable public PropertyEditor findEditor(@Nullable String field, @Nullable Class<?> valueType) { PropertyEditorRegistry editorRegistry = getPropertyEditorRegistry(); if (editorRegistry != null) { Class<?> valueTypeToUse = valueType; if (valueTypeToUse == null) { valueTypeToUse = getFieldType(field); } return editorRegistry.findCustomEditor(valueTypeToUse, fixedField(field)); } else { return null; } }
@Override public String[] resolveMessageCodes(String errorCode, @Nullable String field) { return getMessageCodesResolver().resolveMessageCodes( errorCode, getObjectName(), fixedField(field), getFieldType(field)); }
@Override public void rejectValue(@Nullable String field, String errorCode, @Nullable Object[] errorArgs, @Nullable String defaultMessage) { if ("".equals(getNestedPath()) && !StringUtils.hasLength(field)) { // We're at the top of the nested object hierarchy, // so the present level is not a field but rather the top object. // The best we can do is register a global error here... reject(errorCode, errorArgs, defaultMessage); return; } String fixedField = fixedField(field); Object newVal = getActualFieldValue(fixedField); FieldError fe = new FieldError(getObjectName(), fixedField, newVal, false, resolveMessageCodes(errorCode, field), errorArgs, defaultMessage); addError(fe); }
@Override @Nullable public Object getFieldValue(String field) { FieldError fieldError = getFieldError(field); // Use rejected value in case of error, current field value otherwise. if (fieldError != null) { Object value = fieldError.getRejectedValue(); // Do not apply formatting on binding failures like type mismatches. return (fieldError.isBindingFailure() || getTarget() == null ? value : formatFieldValue(field, value)); } else if (getTarget() != null) { Object value = getActualFieldValue(fixedField(field)); return formatFieldValue(field, value); } else { return this.fieldValues.get(field); } }
@Override @Nullable public Object getFieldValue(String field) { FieldError fieldError = getFieldError(field); // Use rejected value in case of error, current field value otherwise. if (fieldError != null) { Object value = fieldError.getRejectedValue(); // Do not apply formatting on binding failures like type mismatches. return (fieldError.isBindingFailure() || getTarget() == null ? value : formatFieldValue(field, value)); } else if (getTarget() != null) { Object value = getActualFieldValue(fixedField(field)); return formatFieldValue(field, value); } else { return this.fieldValues.get(field); } }
@Override public List<FieldError> getFieldErrors(String field) { List<FieldError> result = new LinkedList<>(); String fixedField = fixedField(field); for (ObjectError objectError : this.errors) { if (objectError instanceof FieldError && isMatchingFieldError(fixedField, (FieldError) objectError)) { result.add((FieldError) objectError); } } return Collections.unmodifiableList(result); }
@Override @Nullable public FieldError getFieldError(String field) { String fixedField = fixedField(field); for (ObjectError objectError : this.errors) { if (objectError instanceof FieldError) { FieldError fieldError = (FieldError) objectError; if (isMatchingFieldError(fixedField, fieldError)) { return fieldError; } } } return null; }
@Override @Nullable public Object getRawFieldValue(String field) { return (getTarget() != null ? getActualFieldValue(fixedField(field)) : null); }
@Override public String[] resolveMessageCodes(String errorCode, @Nullable String field) { return getMessageCodesResolver().resolveMessageCodes( errorCode, getObjectName(), fixedField(field), getFieldType(field)); }