2015-06-10 2 views
1

В моих моделях я использую числовые типы данных, такие как Long, Integer и т. Д. Когда я их создаю, но поставляю String, он выводит трассировку стека исключений, в том числе NumberFormatException. Как я могу правильно обернуть это, чтобы пользовательский интерфейс не видел трассировку стека исключений?Spring MVC: Предотвращение исключений при привязке атрибута модели

+0

Используйте 'try..catch' блок – Jens

+0

Jens, вы имеете в виду в сеттер этого свойства я использую попробовать поймать? –

+0

Да, вот что я имею в виду. – Jens

ответ

2

Вы должны иметь BindingResult аргумент сразу после аргумент команды (с @Value аннотацию) в контроллере. Затем вы можете проверить bindingResult и решить, что делать с вещами, которые не могут быть связаны.

Если у вас есть аргумент BindingResult, тогда метод контроллера вызывается, даже с ошибкой привязки, и вы должны сами обрабатывать ошибку.

Как правило, это будет выглядеть немного как этот пример (создать пользователя или вновь создать визуализации страницы пользователя):

@RequestMapping(method = RequestMethod.POST) 
public ModelAndView create(@Valid UserCreateCommand userCreateCommand, 
          BindingResult bindingResult) { 
    if (bindingResult.hasErrors()) { 
     //or some of your handling for bindingResult errors 
     return new ModelAndView("user/create", userCreateCommand", userCreateCommand); 
    } else { 
    ... 
    } 
} 

Но как разграничить обычные ошибки проверки vs. проверки ошибки, возникающие из-за ошибки NumberFormatException?

BindingResult имеет несколько методов, чтобы получить FieldErrors, например BindingResult.getFieldErrors(). и FieldError обладает свойством boolean isBindingFailure()

+0

Ральф, я использую bindingResult.hasErrors для проверки ошибок проверки. Но как я могу отличить обычные ошибки проверки от ошибок проверки, возникающие из-за ошибки NumberFormatException? –

+1

BindingResult.getFieldErrors(). Get (i) .isBindingFailure() – Ralph

1

Если и хотите отобразить специальное сообщение для этого исключения и должны настроить Spring использовать message.properties файл и указать сообщение «typeMismatch.className.propertyName» или глобальное сообщение для typeMismatch.

Например (Spring 3.2): В сервлета-config.xml

<bean id="messageSource" 
class="org.springframework.context.support.ReloadableResourceBundleMessageSource" 
p:basename="classpath:messages/messages"> 
</bean> 

В SRC/основные/ресурсы/сообщения/messages.properties

typeMismatch = Invalid data format! 

В контроллере:

public String addObject(@Valid @ModelAttribute("objectForm") 
ObjectForm objectForm, BindingResult result, Model model) 
{ 
     if (result.hasErrors()) 
     { 
      return "/addObject"; 
     } 
    //... 
} 

В jsp:

<form:errors path="propertyName" cssClass="divErrorsServer" element="div" /> 


Вы также можете использовать:

System.out.println(result.getAllErrors()); 

Чтобы узнать, какие коды вы можете добавить в файл сообщений для этой ошибки.
Например, когда я использовал строки на private Double weight поле я получил эти коды:

[typeMismatch.objectForm.weight, 
typeMismatch.weight, 
typeMismatch.java.lang.Double, 
typeMismatch] 
Смежные вопросы