Spring 3 формы валидаторов - PullRequest
1 голос
/ 05 января 2012

У меня проблема с проверкой формы в приложении MVC Spring 3.

Кажется, что все настроено, но когда в поле формы вводится неверная запись, она обнаруживается валидатором и сообщение об ошибке не отображается.

вот валидатор

@Component
public class SettingsValidator implements Validator{

@Override
public boolean supports(Class<?> clazz) {
    return VrSettings.class.isAssignableFrom(clazz);
}

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

    ValidationUtils.rejectIfEmpty(errors, "applicationBaseUri", "field.required", "field required");
    ValidationUtils.rejectIfEmpty(errors, "remoteDnsServiceUri","field.required", "field required");

    VrSettings settings = (VrSettings) target;
    try
    {
        URI uri = new URI(settings.getApplicationBaseUri());
    }
    catch (URISyntaxException e)
    {
        errors.rejectValue("applicationBaseUri", "error.invalid.uri", "invalid uri");
    }
    try
    {
        URI uri = new URI(settings.getLocalApplicationBaseURI());
    }
    catch (URISyntaxException e)
    {
        errors.rejectValue("localApplicationBaseURI", "error.invalid.uri", "invalid uri");
    }
    try
    {
        URI uri = new URI(settings.getRemoteDnsServiceUri());
    }
    catch (URISyntaxException e)
    {
        errors.rejectValue("remoteDnsServiceUri", "error.invalid.uri", "invalid uri");
    }

}

}

контроллер ...

@Controller
public class UserInterfaceController {

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


@RequestMapping(method=RequestMethod.POST, value="ui/settings")
public ModelAndView postSettings(@ModelAttribute("settings") @Valid VrSettings settings, BindingResult result)
{
    ModelAndView mav = new ModelAndView("settings");
    mav.addObject("settings", settings);
    if(result.hasErrors())
    {
        mav.addAllObjects(result.getModel());
        return mav;
    }

    LinkedList<VrSettings> vrSettingsList = persistenceManager.getAll(new VrSettings());
    if(vrSettingsList.isEmpty())
    {
        //do things
    }
    else
    {
               //do things
    }

    return mav;
}

}

и, наконец, JSP

<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

    <h3>Configuration Parameters</h3>

        <span style="font-weight:bold; color: red">
            <form:errors path="*" />
       </span><br />
    <div class="form">
    <form:form method="post" action="settings" commandName="settings">

            <form:label for="baseuri" path="applicationBaseUri">base URI*</form:label>
            <form:input class="text" path="applicationBaseUri" size="35" name="baseuri"/>

            <form:label for="localbaseuri" path="localApplicationBaseURI">local base URI</form:label>
            <form:input class="text" path="localApplicationBaseURI" size="35" name="localbaseuri"/>

            <form:label for="ldns" path="remoteDnsServiceUri">ldns URI*</form:label>
            <form:input class="text" path="remoteDnsServiceUri" size="35" name="ldns"/>

            <div class="form-row">
                <input type="submit" value="submit"/>
            </div>

    </form:form>
    </div>

</body>

Я не могу понять, что мне не хватает. Любая помощь приветствуется, спасибо заранее!

1 Ответ

2 голосов
/ 05 января 2012
<form:errors path="*" />

Нужно знать, с каким командным объектом он должен работать. Так что переместите этот тег внутрь

<form:form method="post" action="settings" commandName="settings">

без этого метод org.springframework.web.servlet.tags.form.AbstractHtmlElementBodyTag.shouldRender() для org.springframework.web.servlet.tags.form.ErrorsTag просто возвращает SKIP_BODY, потому что не может найти BindingResult для вашего командного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...