2013-03-16 3 views
2

моя проблема заключается в том, что у меня есть форма, которая имеет HTML выберите элемент с некоторым выбирает значение опции & Я хочу, чтобы проверить эти значения с помощью:Spring MVC проверка формы

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> 

, как я могу, например, проверить значение параметров (DOWN, СЛУШАТЬ, 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; 
+0

показать нам свой объект команды. – Ralph

+0

Извините, что не предоставил достаточно информации, я изменил вопрос с дополнительной информацией, пожалуйста, проверьте это сейчас! – Mehdi

ответ

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 
} 

Но если по каким-либо причинам вы не можете изменить модель, то вы можете использовать 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); 
    } 

} 
+0

... Thanx много! – Mehdi

+0

только одна проблема, когда я вставляю неправильное значение, валидация работает, но с сообщением об ошибке по умолчанию: Не удалось преобразовать значение свойства типа java.lang.String в требуемый тип tm.sys.validator.AgentState для состояния свойства; Вложенное исключение - org.springframework.core.convert.ConversionFailedException: Не удалось преобразовать из типа java.lang.String в тип @ javax.validation.constraints.NotNull tm.sys.validator.AgentState для значения ACTIVE3; Вложенное исключение - это java.lang.IllegalArgumentException: нет константы enum tm.sys.validator.AgentState.ACTIVE3 Как 2 изменить сообщение def и поместить свое сообщение? – Mehdi

+1

Для этого вам нужно либо определить '@ ExceptionHandler' для' org.springframework.core.convert.ConversionFailedException', либо указать собственную стратегию конверсии с помощью '@ InitBinder'. Но поскольку пользователь вводит «статус» в раскрывающемся списке, я считаю, что это не должно происходить вообще. – n1ckolas

Смежные вопросы