有优雅的方法吗? 像这样的消息资源:
label.username=User Name
error.empty={0} is mandatory
error.duplicate={0} is duplicate
info.name=name
我想要{0} i18n。这意味着它将显示“name is mandatory”之类的错误消息,如果用户更改了他的语言环境,那么整个错误消息将会改变,而不仅仅是“必须”。
public class UserValidator implements Validator{
@Autowired
private UserService userService;
@Override
public boolean supports(Class<?> clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User)target;
List<User> ul = userService.getUsersByName(user.getName());
if(ul.size() > 0){
String argName = i18n("info.name");
errors.reject("error.duplicate",new Object[]{argName}, null);
}
}
private String i18n(String messageKey) {
// TODO get message from message resources
return null;
}
}
答案 0 :(得分:0)
通过Validator和Errors接口,我看不到任何直接链接到MesssageSource来获取i18n消息。 Errors接口只需一个键。显然,您必须通过自动装配MessageSource实例并分两步获取翻译:
public class UserValidator implements Validator{
@Autowired
private UserService userService;
@Autowired
private MessageSource messageSource;
@Override
public boolean supports(Class<?> clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User)target;
List<User> ul = userService.getUsersByName(user.getName());
if(ul.size() > 0){
String argName = i18n("info.name");
errors.reject("error.duplicate",new Object[]{argName}, null);
}
}
private String i18n(String messageKey) {
return messageSource.getMessage(messageKey, null, getLocale();
}
}
现在的问题是以某种方式提供Locale。您必须自己弄清楚,具体取决于您希望如何管理此Validator的依赖项。如果你不能提供一个,Spring将获得默认值,但我猜你最终需要它。
如果您需要帮助准备MessageSource实例,请回复我并留下评论,我会给您一些代码。如果您想自己管理,here是一个教程。