0

何が間違っているのか
わかりませんが、値なしで個人フォームを送信した後、html 出力に検証エラーが表示されません。


コントローラーにブレークポイントを追加すると、「エラー」が表示
されるので、result.hasErrors() が * form:errors path="*" を追加しようとし
ました.

Get メソッド:
Person クラスは、アノテーションのない POJO です。

@RequestMapping(value="/person/add" , method = RequestMethod.GET)
public ModelAndView personAdd() {       
    ModelAndView modelAndView = new ModelAndView("personAdd");
    Person person = new Person();
    person.setCreationDate(new Date());
    modelAndView.addObject(person);
    return modelAndView;
}

新しい人を保存する post メソッド

@RequestMapping(value="/person/add" , method = RequestMethod.POST)
public ModelAndView processSubmit(@ModelAttribute("person") Person person,BindingResult result) {

personValidator.validate(person, result);

if (result.hasErrors()) {
    ModelAndView modelAndView = new ModelAndView("personAdd");          
    modelAndView.addObject(person);         
    return modelAndView;
} else {
    ModelAndView modelAndView = new ModelAndView("refreshParent");                      
    dao.persist(person);            
    return modelAndView;
}
}   

personValidator:

@Override
public void validate(Object target, Errors errors) {

    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "personName","required.personName", "Name is required.");

Person フォーム (簡単にするために、名前のみが表示されます)

<form:form method="POST" modelAttribute="person" action="${pageContext.request.contextPath}/person/add">
<form:errors path="*" cssClass="errorblock" element="div"/>
<form:errors path="*" />
      <div class="form-group">
         <label class="control-label" for="inputError">Person Name:</label>  
        <form:input path="personName" class="form-control" placeholder="personName"/>
        <form:errors path="personName" cssClass="error" />
    </div>
<form:form>
4

2 に答える 2

3
ModelAndView modelAndView = new ModelAndView("personAdd");          

この行は aa newModelAndViewを構築し、それによって現在のモデルを破棄します。これに続く行にオブジェクトのみを追加しますが、既に利用可能なバインディング結果を効果的に破棄しています。このコンストラクトを使用する場合は、BindingResults からモデルに渡します。また、モデル オブジェクトは既に含まれているため、もう追加する必要はありません。

ModelAndView modelAndView = new ModelAndView("personAdd", result.getModel());          

ただし、アノテーション駆動型では、この場合は a@Controllerを返す必要はなくModelAndView、単純なものStringで十分です。

@RequestMapping(value="/person/add" , method = RequestMethod.POST)
public ModelAndView processSubmit(@ModelAttribute("person") Person person,BindingResult result) {

    personValidator.validate(person, result);

    if (result.hasErrors()) {
        return "personAdd";
    } else {        
        dao.persist(person);            
        return "refreshParent";
    }
}   

これにより、正しいビューがレンダリングされ、現在のモデル (エラーを含む) はそのまま残ります。

@Validモデル属性引数に追加することで自動検証を適用し、注釈付きメソッドを含める@InitBinderこともできます。

@RequestMapping(value="/person/add" , method = RequestMethod.POST)
public ModelAndView processSubmit(@Valid @ModelAttribute("person") Person person,BindingResult result) {

    if (result.hasErrors()) {
        return "personAdd";
    } else {        
        dao.persist(person);            
        return "refreshParent";
    }
}   

@InitBinder
public void initBinder(WebDataBinder dataBinder) {
    dataBinder.setValidator(personValidator);
}
于 2014-07-03T13:27:15.810 に答える
1

この構成を入れてみてください:

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@Valid @ModelAttribute("pet") Pet pet, BindingResult result) {

    if (result.hasErrors()) {
        return "petForm";
    }

    // ...

}

そして、これをあなたの人のクラスに入れてください

@NotNull
String personName;

また、Spring XML ファイルまたは同じものを Java 構成に配置することを忘れないでください。

<mvc:annotation-driven/>

これはすべて検証を行います

于 2014-07-03T13:08:38.737 に答える