When the binding fails an array of errors keys is created, the first one defined in the messages file will be used. This array will generally contain:
["error.invalid.<fieldName>", "error.invalid.<type>", "error.invalid"]The errors keys are created by Spring DefaultMessageCodesResolver, the root “typeMismatch” is replaced by “error.invalid”.
error.invalid.phone=A valid phone number is required
error.invalid.PhoneNumber=A valid phone number is required
error.invalid.phonenumber=A valid phone number is required
error.invalid.PhoneNumber.PhoneNumber=A valid phone number is required
error.invalid.PhoneNumber.phoneNumber=A valid phone number is required
error.invalid.phonenumber.phonenumber=A valid phone number is required
error.invalid.com.google.i18n.phonenumbers.invalid.PhoneNumber.PhoneNumber=A valid phone number is required
error.invalid.com.google.i18n.phonenumbers.invalid.PhoneNumber.Phonenumber=A valid phone number is required
error.invalid.com.google.i18n.phonenumbers.invalid.phonenumber.phonenumber=A valid phone number is required
error.phone=A valid phone number is required
error.PhoneNumber=A valid phone number is required
error.phonenumber=A valid phone number is required
error.PhoneNumber.PhoneNumber=A valid phone number is required
error.PhoneNumber.phoneNumber=A valid phone number is required
error.phonenumber.phonenumber=A valid phone number is required
error.com.google.i18n.phonenumbers.invalid.PhoneNumber.PhoneNumber=A valid phone number is required
error.com.google.i18n.phonenumbers.invalid.PhoneNumber.Phonenumber=A valid phone number is required
error.com.google.i18n.phonenumbers.invalid.phonenumber.phonenumber=A valid phone number is required
package modules.formatter;
import java.text.ParseException;
import java.util.Locale;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber;
import play.data.format.Formatters;
import play.data.format.Formatters.SimpleFormatter;
import play.i18n.MessagesApi;
@Singleton
public class FormattersProvider implements Provider<Formatters> {
private final MessagesApi messagesApi;
@Inject
public FormattersProvider(MessagesApi messagesApi) {
this.messagesApi = messagesApi;
}
@Override
public Formatters get() {
Formatters formatters = new Formatters(messagesApi);
formatters.register(Phonenumber.PhoneNumber.class, getPhoneNumberFormatter());
return formatters;
}
private SimpleFormatter<Phonenumber.PhoneNumber> getPhoneNumberFormatter() {
return new SimpleFormatter<Phonenumber.PhoneNumber>() {
@Override
public Phonenumber.PhoneNumber parse(String input, Locale l) throws ParseException {
try {
Phonenumber.PhoneNumber phoneNumber = PhoneNumberUtil.getInstance().parse(input, "FR");
if (!PhoneNumberUtil.getInstance().isValidNumberForRegion(phoneNumber, "FR")) {
throw new ParseException("", 0);
}
return phoneNumber;
} catch (NumberParseException e) {
throw new ParseException("", 0);
}
}
@Override
public String print(Phonenumber.PhoneNumber phoneNumber, Locale l) {
return PhoneNumberUtil.getInstance().format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.E164);
}
};
}
}After defining the provider you have to bind it:
import com.google.inject.AbstractModule;
import play.data.format.Formatters;
public class FormattersModule extends AbstractModule {
@Override
protected void configure() {
bind(Formatters.class).toProvider(FormattersProvider.class);
}
}Finally you have to disable Play’s default FormattersModule and instead enable your module in application.conf:
play.modules.enabled += "com.example.FormattersModule"
play.modules.disabled += "play.data.format.FormattersModule"Yes I already did that. Actually the binding works perfectly and my PhoneNumber is parsed in my form.
My problem is the error displayed. I want to customize the error shown by the form When I throw a ParseException. The message is always "error.invalid" which is then translated with I18n in "Invalid value" :(
--
You received this message because you are subscribed to a topic in the Google Groups "Play Framework" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/play-framework/5XVJ0U52MFg/unsubscribe.
To unsubscribe from this group and all its topics, send an email to play-framewor...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/play-framework/b84c576f-7e2a-47ef-ab23-151a6aceb48d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
package forms.authorization;
import com.google.i18n.phonenumbers.Phonenumber;
import play.data.validation.Constraints;
public class CreateOrganizationForm {
@Constraints.Required
//@Constraints.Pattern(value = "^\\+33 [1-9] [0-9]{2} [0-9]{2} [0-9]{2} [0-9]{2}$", message = "error.phoneNumber")
private Phonenumber.PhoneNumber phone;
// other fields
public Phonenumber.PhoneNumber getPhone() {
return phone;
}
public void setPhone(Phonenumber.PhoneNumber phone) {
this.phone = phone;
}
// other getters & setters
}{"phone":["Invalid value"]}