2015-04-14 4 views
0

Рассмотрим следующий метод:Пользовательские ошибки, несоответствие типов связывания

@RequestMapping(value="/foo", method=RequestMethod.POST) 
public void doIt(@Valid PojoRequest request, BindingResult result) throw Exception 
{ 
    if(result.hasErrors()) 
    { 
     throw new Exception(result.getFieldError().getDefaultMessage()); 
    } 
} 

class PojoRequest { 
    String int id; 
    //getter 
} 

Когда я проверить этот метод правильно с параметром String, я получаю следующее сообщение об ошибке:

Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'id'; nested exception is java.lang.NumberFormatException: For input string: "abc"

я могу найти эту данные от BindingResult, но то, что я хочу сделать, это добавить аннотацию к самому полю и записать сообщение об ошибке в аннотацию. Это возможно?

+0

Почему вы позволяете клиенту установить ключ базы данных? –

+0

Это всего лишь фиктивный код. Несмотря на то, что исходный код является чем-то подобным, в этой части кода нет операции с базой данных. Я не знаю, почему ты это сказал. @NeilMcGuigan – mtyurt

+0

Итак, вы просто хотите изменить сообщение об ошибке ... –

ответ

1

Решенный в одном направлении, я буду благодарен другим.

Это не читаемый ответ, это на самом деле хак, , пожалуйста, используйте с предельными мерами предосторожности.

Я определил аннотаций с валидатора:

@Documented 
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = ValidIntegerValidator.class) 
public @interface ValidInteger { 
    String message() default "not a valid integer!"; 
    int min() default 1; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 

public class ValidIntegerValidator implements ConstraintValidator<ValidInteger, Object> { 
    @Override 
    public void initialize(ValidInteger constraintAnnotation) { 

    } 

    @Override 
    public boolean isValid(Object value, ConstraintValidatorContext context) { 
     try { 
      Integer.parseInt((String) value); 
     } catch (NumberFormatException e) { 
      return false; 
     } 
     return true; 
    } 
} 

Затем я изменил поле Pojo следующим образом:

class PojoRequest { 
    @ValidInteger(message = "id is faulty") 
    private Object id; 
    public int getId() { 
     return (int) id; 
    } 

    public void setStartHour(Object id) { 
     this.id = id; 
    } 
} 

сеттер не является необходимым, но если вы определили, который вы в качестве параметра следует принять Object.

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

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