After some investigation, this turns out to be a fundamental problem with DataBinder configuration: A Spring DataBinder is in bean property mode by default and can be switched to direct field access via an "initDirectFieldAccess()" call. Whatever you choose for your JSR-303 constraints needs to be compatible with the DataBinder configuration that you are using, since you are not performing JSR-303 validation on its own - you are rather using it within Spring data binding. So either use field names that match the getter/setter names, or switch your DataBinder to direct field access as well.
Of course, no such constraint applies if you are performing native JSR-303 validation through injection of a javax.validation.Validator/ValidatorFactory: Calling the native JSR-303 validate method there will behave exactly as defined in the specification, with no additional access to the underlying field or property accessor.
Keep in mind that, even with direct field access, the field name that you are using in your domain classes is also the name to use for referring to the field in your view. So unless you want to refer to "_email" field errors in your JSPs as well, I'd recommend using natural field names without additional underscores or the like in any case.
As of Spring 3.0.3, we throw a clearer exception now in case of such misconfiguration, instead of the plain NotReadablePropertyException that you were getting. I hope that this helps a bit at least.