Search code examples
springspring-mvcportletspring-portlet-mvc

Spring + portlet error not displaying on jsp


Spring 3, Portlet API

I am unable to display validation error messages on the jsp page, although bindingResult.hasErrors() returnings true in my action mapping, following is my code. any help appreciated.

Following is my JSP code

<portlet:actionURL var="searchDeviceResultsURL">
    <portlet:param name="doAction" value="searchDeviceResults" />
</portlet:actionURL>

<form:form method="post" action="${searchDeviceResultsURL}">
<div>
<form:errors path="*" />
</div>
...

<input id="sourceId" /> 
...
</form:form>

Following is my controller

@RenderMapping
    public String home(RenderResponse response) {
        return "startup";
    }


    @ModelAttribute("searchForm")
    public SearchForm getCommandObject() {
        return new SearchForm();
    }

    @RenderMapping(params = "doAction=showDeviceResults")
    public String showResults() {
        //return device result JSP name

        return "device_results";
    }

    @ExceptionHandler({ Exception.class })
    public String handleException() {
        return "error";
    }

    /*
     * On submit form this action searches for available devices
     */
    @ActionMapping(params = "doAction=searchDeviceResults")
    public void searchResults(@ModelAttribute(value = "searchForm") SearchForm searchForm, BindingResult bindingResult, 
            ActionResponse response, SessionStatus sessionStatus) {

        searchFormValidator.validate(searchForm, bindingResult);

        if (!bindingResult.hasErrors()) {

            response.setRenderParameter("doAction", "showDeviceResults");
            sessionStatus.setComplete();
        }

    }

Following is my validator

public class SearchFormValidator implements Validator {

    public boolean supports(Class<?> klass) {
        return SearchForm.class.isAssignableFrom(klass);
    }

    public void validate(Object target, Errors errors) {
        //SearchForm searchForm = (SearchForm)target;
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "serviceId", "search.service.field.error");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "sourceId", "search.source.field.error");
        //errors.rejectValue("serviceId", "search.service.field.error");
        //errors.rejectValue("sourceId", "search.source.field.error");  
    }
}

and following is my spring configuration

<bean id="searchFormValidator" class="com.comcast.triage.form.SearchFormValidator" />

<bean
    class="org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean
            class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="validator" ref="searchFormValidator" />
        </bean>
    </property>
</bean>

In my portlet.xml file i have following runtime options

<container-runtime-option>
        <name>javax.portlet.actionScopedRequestAttributes</name>
        <value>true</value>
    </container-runtime-option>
    <container-runtime-option>
        <name>javax.portlet.renderHeaders</name>
        <value>true</value>
    </container-runtime-option>
    <container-runtime-option>
        <name>javax.portlet.escapeXml</name>
        <value>false</value>
    </container-runtime-option>

Solution

  • made two changes and things start working

    1- form tag
    2- form input tag
    
        <form:form name="searchDeviceForm" commandName="searchForm" method="post" action="${searchDeviceResultsURL}">
    
    <form:input path="accNum" />