0

エラーメッセージをレンダリングしようとしましたが、表示されません:

私はバリデーターを持っています:

@Component
class ValidatorFBOSSearch implements Validator {

    @SuppressWarnings("rawtypes")
    @Override
    public boolean supports(Class clazz) {

        return FormBackObjectSearch.class.equals(clazz);
    }

    @Override
    public void validate(Object obj, Errors error) {    

        FormBackObjectSearch fbos = (FormBackObjectSearch)obj;  

        if ("".equals(fbos.particularDate)){            
            error.rejectValue("particularDate", "required.listOfDates", "This field is required");  
        }       
    }
}

フォームのバッキングオブジェクトのフィールドに値が入力されているかどうかをチェックする必要があります。rejectValue には 3 つのパラメーターがあります。最初に-バッキングオブジェクトのモデル属性の値を探し、Secongはプロパティファイルでエラーメッセージを探します(リソース/エラーフォルダーにある私のプロパティファイル) メソッドの3番目のパラメーターは、エラーでメッセージを見つけることができないかどうかを示しますプロパティ ファイルはデフォルトとしてレンダリングします。

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

そして、これは、servlet-context.xml で Validator のエラーを取得するための messageSourse の xml 構成です。

<!-- Resolves error messages for validator from /Education/src/main/webapp/resources/errors-->
    <beans:bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <beans:property name="basename" value="errors/errormessages"/>
    </beans:bean>

ここで、リクエストを処理するためのコントローラーコードの平和:

@RequestMapping(value="/search", method=RequestMethod.GET)
        public void search(Model model) {           
            FormBackObjectSearch fbos = new FormBackObjectSearch();
            model.addAttribute("fbosAttribute", fbos);      
        }


        @RequestMapping(value ="/result", method=RequestMethod.POST)
        public String extract(@RequestParam String nameOfInstitution,
                              @RequestParam String particularDate,
                              @RequestParam String typeOfInstitution,
                              @ModelAttribute("fbosAttribute") FormBackObjectSearch fbos,
                              BindingResult result, RedirectAttributes redirectAttributes, 
                              Model model) throws Exception {

            ValidatorFBOSSearch validatorFBOS = new ValidatorFBOSSearch();
                validatorFBOS.validate(fbos, result);

                if(result.hasErrors()) {
                    redirectAttributes.addFlashAttribute("fbosAttribute", fbos);    
                    return "redirect:/search";


                } else {

                    if(particularDate !="" && nameOfInstitution !="" && typeOfInstitution =="") {                   
                        controllerSupportClass.findWithDateAndName(nameOfInstitution, particularDate, model);                   
                    } else if(particularDate !="" && nameOfInstitution =="" && typeOfInstitution !="") {                    
                        controllerSupportClass.findWithAddedDateAndType(typeOfInstitution, particularDate, model);                  
                    } else if(particularDate !="" && nameOfInstitution =="" && typeOfInstitution ==""){         
                        controllerSupportClass.findWithAddedDate(particularDate, model);    
                    } else if(particularDate !="" && nameOfInstitution !="" && typeOfInstitution !="") {
                        throw new Exception("Search by choose all parameters is not exceptable");   
                    } else {    
                        throw new Exception("You didn't put any search parameters");    
                    }

                }
            return "search";
        }

そして、ここに私のjspの平和があります:

<form:form action="result" method="post" modelAttribute="fbosAttribute" >

<table>

<tr>
<th>Date for extracting:</th> 
<td><form:select  path="particularDate">
<form:option value=""> -Choose date-</form:option>
<form:options items="${listOfDates}"></form:options>
</form:select> <td><form:errors path="particularDate" cssClass="error"/></td>
</td>

</tr>
</table>
</form:form>

問題は、エラー メッセージが表示されないことです。フラッシュ属性を使用して、riderect の後にエラーが表示されるようにしようとしましたが、何も起こりません。ここで、リダイレクトを使用すると、モデルとエラーが削除され、新しいモデルが開始されることがわかりました。しかし、フラッシュ属性を使用して問題を解決するにはどうすればよいでしょうか。ありがとうございました

4

1 に答える 1

0

必要な特定のコントローラーのバリデーターを登録するには、「@InitBimder」アノテーションを使用できます。

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(new ValidatorFBOSSearch());
}

バリデーターを登録する方法の詳細については、私の回答を参照してください: Validation in Spring MVC


チェックステートメントが間違っていると思います:

if ("".equals(fbos.particularDate)){

ユーザーが何も入力しない場合、文字列は空 ( "") ではなく、 になりますnull。したがって、次を使用します。

if (fbos.particularDate == null || fbos.particularDate.isEmpty())
于 2013-06-24T01:16:31.883 に答える