Spring MVC 表单验证

标签 spring jsp servlets spring-mvc validation

我的问题是我有一个表单,其中包含带有一些选择选项值的 html 选择元素,并且我想使用以下方法验证这些值:

org.hibernate.validator.constraints
or
javax.validation.constraints

注释。这是我的选择元素:

<select name="status" id="tbSelect">
    <option value="ACTIVE">ACTIVE</option>
    <option value="LISTEN">LISTEN</option>
    <option value="DOWN">DOWN</option>
</select>

如何使用我上面提到的注释验证器来验证 select 元素内的选项(DOWN、LISTEN、ACTIVE)的值?

我的表格是这样的:

<form:form action="../agents/add" method="POST" commandName="myAgent">
     <form:select id="tbSelect" path="state">
            <form:option value="ACTIVE" path="state">ACTIVE</form:option>
            <form:option value="LISTEN" path="state">LISTEN</form:option>
            <form:option value="DOWN" path="state">DOWN</form:option>
    </form:select>

我已经像这样定义了我的 Controller 方法:

    @RequestMapping(value = "agents/add", method = RequestMethod.POST)
    public String addAgentSubmit(@ModelAttribute("myAgent") @Valid final AgentValidator agent, BindingResult result, RedirectAttributes redirect) {
      if (result.hasErrors()) {
        return "admin/agent/add";
      } 
       ...
    }

我还定义了一个 ModelAttribute,如下所示:

@ModelAttribute("myAgent")
 public AgentValidator getLoginForm() {
    return new AgentValidator();
 }

这也是我的 AgentValidator 类:

public class AgentValidator {
    @NotEmpty(message = "your state can not be empty !")
    private String state;

最佳答案

由于您的 state 字段看起来更像是一个枚举,首先我建议将 state 字段更改为枚举,让 Spring MVC 绑定(bind)该字段并仅使用@NotNull注释:

public class AgentValidator {
    @NotNull(message = "your state can not be empty !")
    private AgenState state;

其中AgentState是:

public enum AgentState {
    DOWN,LISTEN,ACTIVE
}

但如果由于某些原因您无法更改模型,那么您可以使用custom constraints .

特别需要创建注释AgentStateConstraint:

@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = AgentStateConstraintValidator.class)
@Documented
public @interface AgentStateConstraint {

    String message() default "Some message";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

然后您需要创建验证器AgentStateConstraintValidator:

public class AgentStateConstraintValidator implements ConstraintValidator<AgentStateConstraint, String> {

    //Accepted values
    private static final Set<String> ACCEPTED_VALUES = new HashSet<String>(
            Arrays.asList(
                    "DOWN",
                    "LISTEN",
                    "ACTIVE"
            )
    );

    public void initialize(AgentStateConstraint constraintAnnotation) {
    }

    public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
        return ACCEPTED_VALUES.contains(object);
    }

}

关于Spring MVC 表单验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15448481/

相关文章:

java - Servlet Autowiring 失败

java - 如何处理Spring ProviderManager抛出的Spring Security InternalAuthenticationServiceException

Spring Sleuth 跟踪 ID 在 Spring Cloud Gateway 中消失了

java - 如何将欢迎页面设置为 struts 操作?

javascript - 如果 session 值为 null,则更改 JavaScript 中的下拉值

java - Tomcat 控制台正在运行,但显示 "page not found error 404"

java - 我可以在 spring 中使用 afterThrowing() 方法返回自定义类型的对象吗?

java - Spring Boot 在 Chrome 中抛出 ERR_TOO_MANY_REDIRECTS

php - 是否可以在我的 droplet 上同时运行 PHP 和 JSP

java - 设置 AJAX 进度条