【问题标题】:How to show only one validation error message for multiple rows in JSR 303 with spring?java - 如何使用spring仅显示JSR 303中多行的一条验证错误消息?
【发布时间】:2014-07-11 05:19:35
【问题描述】:

有一个包含多行的网格。每行都有两个相同的文本字段。我正在使用 JSR 303 来验证这些字段,并且验证正常进行。但是问题是显示了多个错误消息(每行一个),这是不可取的。有没有办法为所有行的每个字段只显示一条错误消息?

public ModelAndView insert(@Valid @ModelAttribute("proposalwiseselectionform")ProposalWiseSelectionForm proposalwiseselectionformobj,
                               BindingResult result,
                               HttpServletRequest request, HttpServletResponse response) {
        if (result.hasErrors()) {
            if (formBeanObj == null) {
                formBeanObj = proposalwiseselectionformobj;
            }
            mav = new ModelAndView("proposalwiseselection");

            mav.addObject("proposalwiseselectionform", formBeanObj);
        }
    }




public class ProposalWiseSelectionForm {
private String txtLineOfBusiness;
private String txtProduct;
private String btn;
private String clickedGo="N";   
private List arrLineOfBusiness=new ArrayList();
private List arrProduct=new ArrayList();
@Valid
private ArrayList documentList=initiateDocumentList();
private String txtPageMode="I";
private String enableDiscardBtn="N";
private String enableInsertBtn="N";

public ArrayList initiateDocumentList(){
    ArrayList arr=new ArrayList();
    for(int i=0; i<1;i++){
      arr.add(new ProposalWiseSelectionChildForm(i));
    }
    return arr;
  }
}



public class ProposalWiseSelectionChildForm {

private String numProposalWiseSelection;        
private String txtTransactionType;
private String txtTransactionTypeCode;  

@NotEmpty(message="Transaction Type cannot be empty")
private String txtTransactionDesc;

@NotEmpty(message="Document Type cannot be empty")
private String txtPolicyDocument;
private String ynChkBox="0";

}

JSP sn-ps如下,

form:form action="/proposalwiseselection" commandName="proposalwiseselectionform" method="POST" id="proposalwiseselection"/  
form:errors path="*" cssClass="errorblock" element="div"/
form:input path="documentList[${docStatus.index}].txtTransactionDesc"  cssClass="noneditableinputbox" size="40" onkeydown="transactionTypeLOV(event.keyCode,this)" readonly="true" title="Press F2 to get transaction type list" /
form:hidden path="documentList[${docStatus.index}].txtTransactionTypeCode"/
form:input path="documentList[${docStatus.index}].txtPolicyDocument"  cssClass="noneditableinputbox" size="40"  readonly="true"/
form:hidden path="documentList[${docStatus.index}].numPolicyDocumentCode"/

【问题讨论】:

  • 请出示您当前使用的控制器的相关部件
  • 最好用刚刚发布的代码更新问题
  • 我希望尽快回复您
  • 哦,那太好了!
  • 在下面查看我的答案

标签: java spring validation spring-mvc


【解决方案1】:

虽然以下解决方案非常粗略,但它可以执行您需要的功能。 您可以轻松地制作更具可读性并遵守 Spring 原则,但我只是将其整理出来以展示如何完成您所要求的事情。

首先你需要先从 Spring 获取一个Validator

@Autowired
Validaror validator;

接下来您需要删除@Valid 注释并自行执行验证。

这意味着你的方法应该是这样的:

public ModelAndView insert(@ModelAttribute("proposalwiseselectionform")ProposalWiseSelectionForm proposalwiseselectionformobj,
                               BindingResult result,
                               HttpServletRequest request, HttpServletResponse response)

{
        validate(bindingResult);
        if (result.hasErrors()) {
            if (formBeanObj == null) {
                formBeanObj = proposalwiseselectionformobj;
            }
            mav = new ModelAndView("proposalwiseselection");

            mav.addObject("proposalwiseselectionform", formBeanObj);
        }
}

最后验证方法看起来像这样:

private void validate(BindingResult bindingResult) {

    final BindingResult intermediateBindingResult = new BeanPropertyBindingResult(bindingResult.getTarget(), bindingResult.getObjectName()) ;
    validator.validate(bindingResult.getTarget(), intermediateBindingResult);

    final List<FieldError> originalFieldErrors = intermediateBindingResult.getFieldErrors();
    final Set<String> alreadyAddedFieldNames = new HashSet<>();
    final List<FieldError> distinctFieldErrors = new ArrayList<>();
    for (FieldError fieldError : originalFieldErrors) {
        if(alreadyAddedFieldNames.contains(fieldError.getField())) {
            continue;
        }

        distinctFieldErrors.add(fieldError);
        alreadyAddedFieldNames.add(fieldError.getField());
    }

    for (FieldError distinctFieldError : distinctFieldErrors) {
        bindingResult.addError(distinctFieldError);
    }
}

上面的代码所做的是将常规验证存储到中间绑定结果中,然后循环遍历所有 FieldError 并仅添加每个字段的第一个。

【讨论】:

  • 我能准确地预测问题吗?你需要更多的描述吗?请询问您是否想知道其他任何事情..
  • 这里的字段在一个列表中初始化,该列表对于每一行都是递增的并且是唯一的。所以我认为问题在于,尽管每一行的错误都是相同的,但每个字段错误都被视为一个单独的实体。
  • 实际上似乎答案比我发布的更复杂,因为 Spring MVC 完全忽略了新的 BindingResult
  • 我被困在这里,请帮我写代码..“所以我需要自动装配一个简单的验证器,然后转换为 SmartValidator”。
  • 您可以简单地在类中使用@Autowired Validator validator,然后在validate 方法中,您需要先执行SmartValidator smartValidator = (SmartValidator) validator,然后再执行其他操作。
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 2012-07-27
  • 2011-08-09
  • 2018-08-15
  • 2012-06-18
  • 2014-09-28
  • 2011-07-24
  • 1970-01-01
相关资源
最近更新 更多