MultiActionController中执行Spring验证

MultiActionController中执行Spring验证

本文介绍了如何在MultiActionController中执行Spring验证?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在MultiActionController中执行Spring验证?

How to perform Spring validation in MultiActionController?

推荐答案

下面写一个

public class Person {

    private String name;
    private Integer age;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

还有您的MultiActionController

And your MultiActionController

import static org.springframework.validation.ValidationUtils.*;

@Component
public class PersonController extends MultiActionController {

    public PersonController() {
        setMethodNameResolver(new InternalPathMethodNameResolver());

        setValidators(new Validator[] {new Validator() {
            public boolean supports(Class clazz) {
                return clazz.isAssignableFrom(Person.class);
            }

            public void validate(Object command, Errors errors) {
                rejectIfEmpty(errors, "age", "", "Age is required");
                rejectIfEmptyOrWhitespace(errors, "name", "", "Name is required");
            }

        }});
    }

    public ModelAndView add(HttpServletRequest request, HttpServletResponse response, Person person) throws Exception {
        // do something (save our Person object, for instance)

        return new ModelAndView();
    }

}

MultiActionController定义了一个称为 validators 的属性,您应在其中提供 MultiActionController .在这里,您可以看到一段代码,该代码负责验证MultiActionController中的Command对象

MultiActionController defines a property called validators where you should provide any Validator used by your MultiActionController. Here you can see a piece of code which is responsible for validating your Command object inside MultiActionController

ServletRequestDataBinder binder = ...

if (this.validators != null)
    for (int i = 0; i < this.validators.length; i++) {
        if (this.validators[i].supports(command.getClass())) {
    ValidationUtils.invokeValidator(this.validators[i], command, binder.getBindingResult());
        }
    }
}

/**
  * Notice closeNoCatch method
  */
binder.closeNoCatch();

closeNoCatch 方法说

因此,如果您的验证程序返回任何错误,closeNoCatch将抛出 ServletRequestBindingException . 但是,您可以按如下所示在MultiActionController方法中捕获它

So if your Validator returns any Error, closeNoCatch will throw a ServletRequestBindingException. But, you can catch it inside your MultiActionController method, as follows

public ModelAndView hanldeBindException(HttpServletRequest request, HttpServletResponse response, ServletRequestBindingException bindingException) {
    // do what you want right here

    BindException bindException = (BindException) bindingException.getRootCause();

    return new ModelAndView("personValidatorView").addAllObjects(bindException.getModel());
}

为了测试,让我们做下面的一个

In order to test, let's do the following one

@Test
public void failureValidation() throws Exception {
    MockHttpServletRequest request = new MockHttpServletRequest();
    request.setMethod("POST");
    request.setRequestURI("http://127.0.0.1:8080/myContext/person/add.html");

    /**
     * Empty values
     */
    request.addParameter("name", "");
    request.addParameter("age", "");

    PersonController personController = new PersonController();

    ModelAndView mav = personController.handleRequest(request, new MockHttpServletResponse());

    BindingResult bindingResult = (BindingResult) mav.getModel().get(BindingResult.MODEL_KEY_PREFIX + "command");

    /**
     * Our Validator rejected 2 Error
     */
    assertTrue(bindingResult.getErrorCount() == 2);
    for (Object object : bindingResult.getAllErrors()) {
        if(object instanceof FieldError) {
            FieldError fieldError = (FieldError) object;

            System.out.println(fieldError.getField());
        }
    }
}

这篇关于如何在MultiActionController中执行Spring验证?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-26 06:01