当前位置: 首页 > 知识库问答 >
问题:

来自ValidationMessages的带有Json响应验证错误的Spring MVC JSR 303验证。属性

尚棋
2023-03-14

嗨,我到处找,但找不到解决方案。我正在Jquery函数中调用ajax,并从spring输入表单提交数据:输入到控制器。控制器通过JSR 303 Hibernate验证验证日期,并通过JSON将错误返回给同一Jquery函数(通过JSON接收数据),并在jsp中显示错误。一切正常,但显示的错误消息只是dafault或来自验证注释的消息参数。我想从ValidationMessages中获取错误消息。属性文件和我有一个包含就绪消息的文件,但显示消息是错误的,而不是来自ValidationMessages。属性。我没有使用form:error标记,因为我想显示Json接收到的错误。问题是,错误消息不是从文件显示的,而是从dafault显示的。

在执行常规JSR 303验证(没有Ajax和Json)时,我将补充一点:错误标记一切正常,消息来自ValidationMessages。属性文件。

我的jsp页面

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
     <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Add Users using ajax</title>
         <script src="<%=request.getContextPath() %>/js/jquery.js"></script>
         <script type="text/javascript">
           var contexPath = "<%=request.getContextPath() %>";
         </script>
         <script src="<%=request.getContextPath() %>/js/user.js"></script>
          <link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/style/app.css">
     </head>

       <body>
          <h1>Add Users using Ajax ........</h1>
           <form:form method="post"  modelAttribute="user">
           <table>
                <tr><td colspan="2"><div id="error" class="error"></div></td></tr> 
                   <tr><td>Name:</td> <td><form:input path="name" /></td> 
                <tr><td>Education</td> <td><form:input path="education" /></td> 

                <tr><td colspan="2"><input type="button" value="Add Users" onclick="doAjaxPost()"><br/></td></tr>

                <tr><td colspan="2"><div id="info" class="success"></div></td></tr>
          </table>

  </form:form>

</body>
</html>

用户中的My doAjaxPost函数。js公司

      function doAjaxPost() {  
  // get the form values  
  var name = $('#name').val();
  var education = $('#education').val();

  $.ajax({  
    type: "POST",  
    url: contexPath + "/AddUser.htm",  
    data: "name=" + name + "&education=" + education,  
    success: function(response){
      // we have the response 
      if(response.status == "SUCCESS"){
          userInfo = "<ol>";
          for(i =0 ; i < response.result.length ; i++){
              userInfo += "<br><li><b>Name</b> : " + response.result[i].name + 
              ";<b> Education</b> : " + response.result[i].education;
          }
          userInfo += "</ol>";
          $('#info').html("User has been added to the list successfully. " + userInfo);
          $('#name').val('');
          $('#education').val('');
          $('#error').hide('slow');
          $('#info').show('slow');
      }else{

          errorInfo = "";
          for(i =0 ; i < response.result.length ; i++){

              errorInfo += "<br>" + (i + 1) +". " + response.result[i].defaultMessage;

          }
          $('#error').html("Please correct following errors: " + errorInfo);

          $('#info').hide('slow');
          $('#error').show('slow');

      }       
    },  
    error: function(e){  
      alert('Error: ' + e);  
    }  
  });  
}  

这是一个控制器

  package com.raistudies.controllers;

  import java.util.ArrayList;
  import java.util.List;
  import java.util.Map;

   import javax.validation.Valid;
   import org.springframework.stereotype.Controller;
   import org.springframework.validation.BindingResult;
   import org.springframework.web.bind.annotation.ModelAttribute;
   import org.springframework.web.bind.annotation.RequestMapping;
   import org.springframework.web.bind.annotation.RequestMethod;
   import org.springframework.web.bind.annotation.ResponseBody;

   import com.raistudies.domain.JsonResponse;
   import com.raistudies.domain.User;

  @Controller
  public class UserController {
private List<User> userList = new ArrayList<User>(); 

@RequestMapping(value="/AddUser.htm",method=RequestMethod.GET)
public String showForm(Map model){
    User user = new User();
    model.put("user", user);
    return "AddUser";
}


@RequestMapping(value="/AddUser.htm",method=RequestMethod.POST)
public @ResponseBody JsonResponse addUser(@ModelAttribute(value="user") @Valid User user, BindingResult result ){
    JsonResponse res = new JsonResponse();

    if(!result.hasErrors()){
        userList.add(user);
        res.setStatus("SUCCESS");
        res.setResult(userList);

    }else{
        res.setStatus("FAIL");
        res.setResult(result.getAllErrors());

    }

    return res;
}

  }

用户类

 package com.raistudies.domain;

 import org.hibernate.validator.constraints.NotEmpty;

 import javax.validation.constraints.Size;

 public class User {

@NotEmpty
private String name = null;

@NotEmpty
@Size(min=6, max=20)
private String education = null;


public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getEducation() {
    return education;
}
public void setEducation(String education) {
    this.education = education;
}

  }

下面是ValidationMessage。属性文件

  NotEmpty.user.name=Name of user cant be empty
  NotEmpty.user.education = User education cant be empty
  Size.education=education must hava between 6 and 20 digits

这是应用程序配置。xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<!-- Application Message Bundle -->
   <bean id="messageSource"    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="/WEB-INF/ValidationMessages" />
</bean>


<!-- Scans the classpath of this application for @Components to deploy as beans -->
<context:component-scan base-package="com.raistudies" />

<!-- Configures the @Controller programming model -->
<mvc:annotation-driven/>



<!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>



   </beans>

这是一个屏幕截图https://www.dropbox.com/s/1xsmupm1cgtv4x7/image.png?v=0mcns

如您所见,显示的默认错误消息不是来自ValidationMessages.properties文件。如何解决这个问题?

共有2个答案

王弘和
2023-03-14

你可以试试这个:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="messageInterpolator" ref="messageSource"/>
</bean>

<mvc:annotation-driven validator="validator"/> 

其思想是明确地告诉验证器要使用哪个消息源。我自己也没有试过,但可能值得一试。

慕河
2023-03-14

我知道这是一个非常古老的问题,但我已经尝试解决这个问题一段时间了。因为我刚刚找到了一个关于这个的工作,我想分享它来帮助其他可能被困在同样的事情上的人。

请注意,我正在使用java配置执行此操作,因此我使用注释。

首先,在控制器上,向环境添加自动连线链接。这是为了能够读取属性文件:

@Autowired
private Environment environment;

OP已经通过XML定义了messageSource,但在java config中,它将位于扩展WebMVCConfigureAdapter的config类上。就我而言,它与:

@Bean
public MessageSource messageSource() {
   ResourceBundleMessageSource msg= new ResourceBundleMessageSource();
   msg.setUseCodeAsDefaultMessage(true);
   msg.setBasename("PATH_TO_YOUR_MESSAGE_FILE");
   msg.setDefaultEncoding("UTF-8");
   return msg;
}

确保用文件路径替换该部分。无论如何,现在要解决这个问题。回到控制器上,更换此行:

res.setResult(result.getAllErrors());

对于此函数,并调用一个新函数:

createErrorMessages(result.getFieldErrors());

现在,这是转换消息的新方法:

private LinkedList<CustomErrorMsg> createErrorMessages(List<FieldError> originalErrors) {
    // Create a new list of error message to be returned
    LinkedList<CustomErrorMsg> newErrors = new LinkedList<>();

    // Iterate through the original errors
    for(FieldError fe: originalErrors) {
        // If the codes are null, then put the default message,
        // if not, then get the first code from the property file.
        String msg = (fe.getCodes() == null) ? fe.getDefaultMessage()
                : environment.getProperty(fe.getCodes()[0]);

        // Create the new error and add it to the list
        newErrors.add(new CustomErrorMsg(fe.getField(), msg));
    }

    // Return the message
    return newErrors;
}

if部分使其适用于没有代码的情况,也适用于对控制器执行业务逻辑验证检查并手动添加新字段错误的情况。

此工作方法不适用于海关消息上的参数。另一个注意事项是,如果您碰巧有其他页面使用Hibernate验证但不需要AJAX回调,您将不需要使用此策略。这些只是默认工作。

我很清楚这一点也不优雅,它可能会添加比预期更多的代码,但正如我之前所说的,这是一种“变通方法”。

 类似资料:
  • 我在验证从ADFS服务器获得的SAML响应时遇到了问题。我以url的形式获得响应,例如,而是http://www.w3.org/2001/04/xmldsig-more#rsa-sha256。我设法解码了响应,但无法找到使用给定签名验证响应的方法。 我的主要问题是签名有一个非常意外的格式。由于给定的签名算法,我希望签名的长度为32字节,但是当我base64-decode签名时,我得到的是长度为25

  • 状态{statuscode=network_error,resolution=null} 任何形式的帮助都将受到高度赞赏。

  • 我正在使用带有PRG模式的JSF。(在我的导航规则中使用)。 问题是,当我收到验证错误(例如:用户未设置强制值)时,重定向没有完成(即,一篇文章后面跟着同一页的get)。 情况是: > 用户没有输入强制值并提交表单 发生验证错误,同一视图显示错误消息(无PRG) 用户设置强制值并提交== 用户点击后退按钮= 谁能帮帮我吗? 提前感谢。 斯特凡

  • OpenAM是否依赖于注册IDP的公钥来使SAML响应多样化 或还取决于来自IDP-like算法的SAML响应中的哈希算法=”http://www.w3.org/2000/09/xmldsig#sha1“” 注意OpenAM版本:13.0.0

  • 问题内容: 非常奇怪的错误。我使用的是http://developers.facebook.com/docs/authentication/。所以我创建了对fb的请求并传递redirect_uri。我在本地主机上使用测试站点。所以如果我通过 redirect_uri = http://localhost/test_blog/index.php 它工作正常,但如果我通过 redirect_uri =

  • 我一直在寻找一种能够让我: 验证复杂的(大结构、许多可选的元素子/序列、固定顺序等)XML; 为每个检查/检查块/规则定义自定义错误消息(类似XSD处理器的错误对我没有用); 如果可能,以人类可读的方式有效地定义验证模式/规则; 换句话说,类似Schematron的东西(允许自定义错误MSG,可读性等),但对于复杂的结构检查仍然很好(XPath对于顺序检查之类的事情效率很低)。 是否有一些合适的技