2

私の問題は、いくつかの選択オプション値を持つhtml select要素を持つフォームがあり、次を使用してそれらの値を検証したいことです:

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 要素内の options(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>

次のようにコントローラーメソッドを定義しました。

    @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;
4

1 に答える 1

2

フィールドは列挙型に似ているためstate、まずstateフィールドを列挙型に変更することをお勧めします。Spring MVC にそのフィールドをバインドさせ、@NotNullアノテーションのみを使用させます。

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

どこAgentStateにある:

public enum AgentState {
    DOWN,LISTEN,ACTIVE
}

ただし、特定の理由でモデルを変更できない場合は、カスタム制約を使用できます。

特に、注釈を作成する必要があります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);
    }

}
于 2013-03-17T09:24:02.507 に答える