Typemismatch с меткой I18N вместо имени атрибута
-
21-09-2019 - |
Вопрос
My message.properties содержит это по умолчанию:
typeMismatch.java.lang.Double=Property {0} должно быть допустимым числом
Заполнитель {0} заменяется именем атрибута.Я хочу использовать Ярлык, который используется для интерфейса, следующим образом:
typeMismatch.java.lang.Double=Property {здесь замечательная метка} должно быть допустимым числом.
Моя первая Попытка:
typeMismatch.java.lang.Double=Property ${сообщение(код:'0')} должно быть допустимым числом.
не работает, потому что нет сообщения '0'.Документация на этом этапе неясна.У кого-нибудь есть идея по этому поводу?
Редактировать:
Ну, я могу написать сообщение об ошибке для каждого атрибута следующим образом:
typeMismatch.Book.номер книги = свойство Номер книги должен быть допустимым числом.
Но это похоже на большую дополнительную работу...
Решение
Так что я допустил небольшую ошибку..теперь это чертовски просто...Я отвечу на это здесь.Может быть, кто-нибудь столкнется с этим:
Моя ошибка заключалась в:
typeMismatch.java.lang.Double=Property {0} must be a valid number
{0} было заменено на Название атрибутов.
Причина этого заключалась в том, что Grails API rendererror ищет правильные имена классов и свойства.
Например:
Мой класс называется Book, а свойство - number .
В свойствах моего сообщения:
book.number = Booknumber
Для i18n все работало нормально, но когда должно появиться сообщение об ошибке, оно показывает следующее:
"Property number must be a valid number."
Правильная версия в свойствах сообщения:
Book.number = Booknumber
Теперь это работает у меня.:-)
Другие советы
Потрясающе!Большое спасибо за ваш пост!Когда поначалу у меня это не сработало, мне потребовалось некоторое время, чтобы понять, что мне нужно использовать полное имя класса перед именем свойства.Таким образом, синтаксис таков:
package.ClassName.propertyName=Label
Очень полезно!Еще раз спасибо!Эл
Валидаторы ошибок привязки данных Spring ("{0}" должно быть допустимым числом) хотят fullClassName.fieldName
Короткое имя класса и / или .label не распознаются, см. org.springframework.validation.DefaultBindingErrorProcessor#getArgumentsForBindError
Валидаторы Grails ("{0} должен быть действительный адрес электронной почты") хотят FQClassName.fieldName.label
или classPropertyName.fieldName.label
Добавление .label
является обязательным, как видно из org.codehaus.groovy.grails.validation.AbstractConstraint#rejectValueWithDefaultMessage
Следовательно, вам нужно и то, и другое FQN/shortClassName.attributeName.label
и FQN.attributeName
чтобы получить одно и то же переводимое имя, понятное для человека, в обеих проверках.
Еще один совет, на случай, если это поможет следующему пользователю, если вы получаете недружественное сообщение об ошибке типа "Property producer.employeeCount должно быть допустимым числом", попробуйте добавить свойство с именем просто producer.employeeCount в свой файл messages.properties как таковое:
producer.employeeCount=Количество сотрудников
По крайней мере, в Grails 2.0.0 это приведет к более дружественному сообщению:"Количество сотрудников в собственности должно быть действительным числом".
Используя полное имя класса (например,com.example.domain.Client.employeeCount), с ".label" в конце или без него, у меня не сработало.
Надеюсь, это кому-то поможет.