 <p>Check again <code>FieldError</code> constructor, according to JavaDocs, 3rd parameter is rejected field value:</p> <pre><code>rejectedValue - the rejected field value </code></pre> <p>The exact part of code which overrides value is in <code>AbstractBindingResult</code> class:</p> <pre><code>public Object getFieldValue(String field) { FieldError fieldError = getFieldError(field); // Use rejected value in case of error, current bean property value else. Object value = (fieldError != null ? fieldError.getRejectedValue() : getActualFieldValue(fixedField(field))); // Apply formatting, but not on binding failures like type mismatches. if (fieldError == null || !fieldError.isBindingFailure()) { value = formatFieldValue(field, value); } return value; } </code></pre> <p>So while you provide <code>FieldError</code> class with null <code>rejectedValue</code>, the form field is cleared. As or me, I've always used <code>rejectValue</code> instead of <code>addError</code>:</p> <pre><code>result.rejectValue( "field", "errorCode" ); </code></pre>