如何从属性文件中获取本地化消息,并在bindingResult中出错?

时间:2014-09-09 15:23:12

标签: spring validation spring-mvc binding spring-data

您好我有一些Ajax Forms,我使用Async POST向服务器发送数据......

如果BindingResult出现错误,我想在输入字段后面显示一条消息来解释错误,这是我控制器中的方法

@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public Map<String, String> create(@Valid MyClass myClass, BindingResult bindingResult, Model uiModel, 
        HttpServletRequest httpServletRequest, HttpServletResponse response, Locale locale) {

        if (bindingResult.hasErrors()) {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            Map<String, String> errorFields = new HashMap<String, String>();
            for(FieldError fieldError : bindingResult.getFieldErrors()){
                errorFields.put(fieldError.getField(), fieldError.getDefaultMessage());
            }
            return errorFields;
        }

        uiModel.asMap().clear();

        myService.create(personale);

    return null;
}

并且有效,但fieldError.getDefaultMessage()会返回英语消息,但我想要返回本地化消息..

我知道我可以这样做:

@NotNull(message="{myMessage}")
private Field field;

但是我不会为每个字段指定本地化的消息,也许我可以使用message.properties文件??

有可能吗?

谢谢!

修改

我读到了这个:another question about my problem,但我无法从消息中得到......

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,我可以通过这种方式解决它:

  1. 在src(mybasename_locale.properties)
  2. 下定义属性消息
  3. 在配置文件(dispatcher-servlet.xml)中包含这些元素,以便正确初始化Spring的类l18n相关

    <bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename">
        <value>mybasename</value>
    </property>
    

    <bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale">
        <value>es</value>
    </property>
    

  4. 在您的控制器中,获取对ResourceBundleMessageSource bean的引用。

    @Autowired
    private ResourceBundleMessageSource mensajes;
    
  5. 然后,您可以通过getMessage方法获取错误消息getMessage(MessageSourceResolvable arg0,Locale arg1)

    @RequestMapping(path = "/login", method=RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<Validacion> login(@Valid @RequestBody LoginUsuario login_usuario, BindingResult result) {
    
        if (result.hasErrors()) 
            {
                System.out.println("HAY ERRORES");
                System.out.println(mensajes.getMessage(result.getFieldError(), LocaleContextHolder.getLocale()));
            }