Struts2验证表现得很奇怪

时间:2012-09-04 21:19:31

标签: java validation struts2

这是我的验证方法 -

@Override
  public void validate() {
    errors = new HashMap<String, String>();
    if(StringUtil.isBlank(examCode)){
      errors.put("examCode", "Exam code is required");
    }
    if(StringUtil.isBlank(strPaperType)){
      errors.put("paperType", "Paper Type is required");
    }else{
      paperType = PaperType.getPaperTypeByValue(strPaperType);
      if(paperType == null){
        errors.put("paperType", "A valid Paper Type is required");
      }
      if(paperType.equals(PaperType.PRACTICE)){
        if(topicId ==null){
          errors.put("topicId", "Topic Id is required");
        }
      }
    }
    if(StringUtil.isBlank(instructions)){
      errors.put("instructions", "Paper Instructions are required");
    }
  }

'errors'是我在动作中定义的地图。我没有在'fieldErrors'中添加任何错误。如果我调试'fieldErrors'我甚至在进入'验证'方法之前发生了什么我看到以下两个条目 -

{"id":["Invalid field value for field \"id\"."],"topicId":["Invalid field value for field \"topicId\"."]}

我不知道他们在哪里被添加。这是我的struts conf。

<package name="api" extends="json-default" namespace="/api">
    <action name="paper" class="paperApiAction">
      <result name="json" type="json">
        <param name="root">responseDto</param>
      </result>
      <result name="input" type="json">
        <param name="root">fieldErrors</param>
      </result>
    </action>
  </package>

需要帮助。感谢

2 个答案:

答案 0 :(得分:2)

"conversionError" interceptor会收到类型转换错误并将其放入fieldErrors。有一些用例,它更容易从堆栈中取出;我不确定这是不是其中之一。

为什么要重复fieldErrors地图?即使您只想在自己的DTO中使用地图,为什么不使用现有的验证机制?差异是微不足道的,而且更加灵活。然后,您可以将纸张类型验证构建到外部化业务逻辑中,并简化对它和操作的测试。


不相关,但由于缺少空白,我发现您的代码难以阅读。一个天真的重构:

@Override
public void validate() {
    errors = new HashMap<String, String>();

    if (StringUtil.isBlank(examCode)) {
        errors.put("examCode", "Exam code is required");
    }

    if (StringUtil.isBlank(instructions)) {
      errors.put("instructions", "Paper Instructions are required");
    }

    if (StringUtil.isBlank(strPaperType)) {
        errors.put("paperType", "Paper Type is required");
    } else {
        validatePaperType();
    }
}

public void validatePaperType() {
    paperType = PaperType.getPaperTypeByValue(strPaperType);
    if (paperType == null) {
        errors.put("paperType", "A valid Paper Type is required");
        return;
    }

    if (paperType.equals(PaperType.PRACTICE) && (topicId == null)) {
        errors.put("topicId", "Topic Id is required");
    }
}

答案 1 :(得分:0)

您似乎 id topicId 类变量是整数,但您尝试将它们设置为字符串。