When using the StringField as part of a new field class the underlying validate will cause the string field to always be required. StringField calls it super.validate which checks the required flag but the StringField validate then goes on to check if the field value is empty and adds an exception if it is without checking if it is required or not.